1

現在のディレクトリ内のファイルのすべてのファイル ハンドルをハッシュの値として格納するコードがあります。キーはファイルの名前です。

my %files_list;    #this is a global variable.
sub create_hash() {
    opendir my $dir, "." or die "Cannot open directory: $!";
    my @files = readdir $dir;
    foreach (@files) {
        if (/.text/) {
            open(PLOT, ">>$_") || die("This file will not open!");
            $files_list{$_} = *PLOT;
        }
    }
}

コンパイルの問題に直面しているコードで print ステートメントを使用しています。

my $domain = $_;
opendir my $dir, "." or die "Cannot open directory: $!";
my @files = readdir $dir;
foreach (@files) {
    if (/.text/ && /$subnetwork2/) {
        print $files_list{$_} "$domain";    #this is line 72 where there is error.
    }
}
closedir $dir;

コンパイル エラーは次のとおりです。

String found where operator expected at process.pl line 72, near "} "$domain""
        (Missing operator before  "$domain"?)
syntax error at process.pl line 72, near "} "$domain""

誰かが私が障害を理解するのを手伝ってくれますか?

4

3 に答える 3

2

最初の問題:サブルーチンを実行した後、すべてのキーでいっぱいになっていたcreate_hashでしょう。%files_list*PLOT

すべてprint {$files_list{$_}} "$domain";が最後に開いたファイルに出力されます。
解決:

-open(PLOT,">>$_") || die("This file will not open!");
-$files_list{$_}=*PLOT;
+open($files_list{$_},">>$_") || die("This file will not open!");

2番目の問題:ファイル記述子を印刷する前に、ファイル記述子が存在することを確認しないでください
。解決策:

-if(/.text/ && /$subnetwork2/)
-{
-    print $files_list{$_} "$domain";#this is line 72 where there is error.
+if(/.text/ && /$subnetwork2/ && exists $files_list{$_})
+{
+    print {$files_list{$_}} $domain;

そして、ファイルハンドルを閉じることを忘れないでください...

于 2012-08-10T09:47:28.940 に答える
2

print のドキュメントを読む必要があるかもしれません。最後の段落は次のように述べています。

配列またはハッシュにハンドルを格納している場合、または一般に、ベアワード ハンドルまたは添字なしの単純なスカラー変数よりも複雑な式を使用してそれを取得する場合は常に、ファイルハンドル値を返すブロックを使用する必要があります。代わりに、その場合、LIST は省略できません。

print { $files[$i] } "stuff\n";
print { $OK ? STDOUT : STDERR } "stuff\n";
于 2012-08-10T12:30:31.983 に答える
1

多分このように:

print {$files_list{$_}} "$domain";
于 2012-08-10T09:35:28.143 に答える