我刚刚开始学习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 :(得分: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
};
答案 1 :(得分: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');