-3

ディレクトリ内のファイルをループし、ファイル名に基づいてファイルを見つけ、ファイルの内容を出力するにはどうすればよいですか?

以下のコードを参照してください: ディレクトリ内のファイル:

1234.txt
345.txt
234.txt

コード:

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 $_;
        }
    }
}
4

2 に答える 2

-1

あなたの質問のコード:

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

そのため、コードが意味すること以外のことをしようとしているように感じます。

于 2013-03-15T14:00:48.897 に答える
-1

これは行う必要があります(テストされていません):

opendir( DIR, "/path/to/dir" );
while ( my $entry = readdir( DIR ) ) {
    if ( $entry =~ /^$filenameImLookingFor$/ ) {
        open( FILE, "$entry/$filenameImLookingFor" );
        my @lines = <FILE>;
        close( FILE );
        print( join( '', @lines );
    }
}
closedir( DIR );
于 2013-03-15T14:02:00.477 に答える