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 に答える