打开位于同一目录中的文件时出错

时间:2012-12-08 15:44:21

标签: perl file directory

我刚刚开始学习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',程序可以正常工作。但是,即使没有我指定目录,它仍然无法工作,因为程序和文件在同一个文件夹中?

2 个答案:

答案 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');