あなたの質問のコード:
opendir (DIR, "LOCATION")|| die "cant open directory\n";
my @DATA = grep {(!/^\./)} readdir (DIR);
while ( my $file = shift @DATA) {
open FILE, "LOCATION";
while (FILE){
if ($file eq "235") {
print $_;
}
}
}
これを行います:
最初に、ピリオドで始まらないディレクトリ "LOCATION" 内のすべてのファイルを簡単に検索します。次に、各ファイル名に対してかなり奇妙なループを繰り返します。このループの通常のバージョンは次のようになります。
for my $file (@DATA)
次に、ディレクトリ「LOCATION」を再度開こうとします。「LOCATION」はディレクトリであるため、これは失敗する可能性があります。で戻り値をチェックしていないのでdie
、このエラーは黙っています。
あなたがおそらく使いたいのは
if ($file eq "235.txt") {
open my $fh, "<", $file or die $!;
print <$fh>;
}
この部分:
while (FILE)
の戻り値を実際にチェックするのではなくreadline()
、ファイル ハンドルが真の値を返すかどうかをチェックしています。私のシステムでわかる限り、open
失敗した場合でも真の値を返します。もちろん、これはループが無期限に実行されることを意味します。あなたがおそらく意味していたのは
while (<FILE>)
open
ただし、前に説明したように、このステートメントはディレクトリを開くことができないため、「開かれていないファイル ハンドル FILE に対する readline()」というエラーが発生するだけです。
あなたの小切手
if ($file eq "235")
ファイル名には拡張子があると言ったので、決して真実ではありません.txt
。代わりにそうするかもしれません
if ($file eq "235.txt")
どちらが機能するはずです。
賢くしたい場合は、チェックを grep に直接含めることができます。
my @files = grep { $_ eq "235.txt" } readdir DIR;
また、perl は<>
diamond 演算子を使用して@ARGV
配列にリストされたファイルを出力できるため、これを行うこともできます。
@ARGV = grep { $_ eq "235.txt" } @ARGV;
print <>;
次のようにスクリプトを呼び出すと仮定します。
perl script.pl dir/*.txt
もちろん、これは単に実行の長いバージョンです。
perl -pe0 235.txt
のロングバージョンはどれですか
cat 235.txt
そのため、コードが意味すること以外のことをしようとしているように感じます。