1

ディレクトリ内にいくつかのテキスト ファイルがあり、その内容を解析してファイルに書き込みたいと考えています。これまでのところ、私が使用しているコードは次のとおりです。

#!/usr/bin/perl

#The while loop repeats the execution of a block as long as a certain condition is evaluated true

use strict; # Always!
use warnings; # Always!

my $header = 1; # Flag to tell us to print the header
while (<*.txt>) { # read a line from a file
    if ($header) {
        # This is the first line, print the name of the file
        **print "========= $ARGV ========\n";**
        # reset the flag to a false value
        $header = undef;
    }
    # Print out what we just read in
    print;
}
continue { # This happens before the next iteration of the loop
    # Check if we finished the previous file
    $header = 1 if eof;
}

このスクリプトを実行すると、ファイルのヘッダーとcompiled.txtエントリのみが取得されます。cmd で次のメッセージも受け取ります。use of uninitialized $ARGV in concatenation <.> or string at concat.pl line 12

だから私は何か間違ったことをしていると思います$ARGVが、まったく使用されていません。さらに、テキストを取得するには、代わりに$header何か他のものを使用する必要があります。

助けが必要です!

4

2 に答える 2

1

<*.txt>コメントでそう言ったとしても、ファイルから行を読み取りません。走る

glob '*.txt'

つまり、while ループはファイルの内容ではなく、ファイル名を反復します。empty<>を使用して、すべてのファイルを反復処理します。

ところで、代わりに を$header = undef使用できますundef $header

于 2013-05-24T11:05:18.737 に答える
1

私が理解しているように、最初の行の直前にファイル名を含むヘッダーを印刷し、それらをすべて新しい行に連結します。その場合、そのタスクにはワンライナーで十分です。

最初の行を変数でチェックし$.、ファイルハンドルを閉じて、異なる入力ファイル間でその値をリセットします。

perl -pe 'printf qq|=== %s ===\n|, $ARGV if $. == 1; close ARGV if eof' *.txt

私のマシンの例は次のようになります。

=== file1.txt ===
one
=== file2.txt ===
one
two
于 2013-05-24T11:02:04.337 に答える