2012-12-08 33 views
4

我刚开始学习Perl,并遇到与打开与我的程序位于同一目录中的文件相关的问题。打开位于同一目录中的文件时出错

#!/usr/bin/perl -w 

$proteinfilename = 'NM_021964fragment.pep'; 

open(PROTEINFILE, $proteinfilename) or die "Can't write to file '$proteinfilename' [$!]\n"; 

$protein = <PROTEINFILE>; 

close(PROTEINFILE); 

print "Essa é a sequência da proteína:\n"; 
print $protein, "\n"; 

exit; 

当我指定的文件目录,从“NM_021964fragment.pep”到'/Users/me/Desktop/programa/NM_021964fragment.pep不断变化的,程序工作。但是即使没有我指定的目录,它也不能工作,因为程序和文件都在同一个文件夹中?

+0

给'./ NM_021964fragment.pep'一试。 –

+0

您的脚本适用于我。你运行这个确切的代码?你的操作系统是什么? – TLP

+0

而且,我认为你的脚本死于错误'没有这样的文件或目录'?报告确切的错误是一个好主意,以供将来参考,即使它对您来说显而易见,对其他人来说也不明显。 – TLP

回答

1

相对路径是相对于当前工作目录而不是脚本的目录。当剧本工作时,他们碰巧是一样的。但是,正如你发现的那样,情况并非总是如此。你可以使用下面的方法达到您所描述的行为:

use Cwd   qw(realpath); 
use Path::Class qw(file); 

my $script_dir = file(realpath($0))->dir; 
my $input_file = $script_dir->file('NM_021964fragment.pep'); 
2

如果你正在做一个简单的文件读取,你可以使用<>钻石运营商简单。

use strict; 
use warnings; 

my $protein = <>; 
print "Essa é a sequência da proteína:\n"; 
print "$protein\n"; 

并使用像这样的脚本:

perl script.pl NM_021964fragment.pep 

这将迫使你使用了正确的路径,假设你使用标签自动完成,当你运行你的脚本。

以这种方式使用命令行参数有点不安全,因为可以通过不受保护的open命令执行任意代码。您可以使用模块ARGV::readonly来防止出现这种情况。或简单地使用代码本身,它很简单:

for (@ARGV){ 
    s/^(\s+)/.\/$1/; # leading whitespace preserved 
    s/^/< /;   # force open for input 
    $_.=qq/\0/;   # trailing whitespace preserved & pipes forbidden 
}; 
相关问题