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”,程序运行。但是,即使没有我指定目录,它也不能工作,因为程序和文件在同一个文件夹中?

4

2 回答 2

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
};
于 2012-12-08T16:18:48.887 回答
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');
于 2012-12-08T15:56:57.293 回答