18

コマンドラインで指定されたファイルから読み取るために、Perl のダイヤモンド演算子を使用しています。 <>

のようなメッセージを報告できるようにしたいのです"Trouble on line $. of file $FILENAME"が、どのファイルが現在ダイヤモンドで使用されているかを知るにはどうすればよいですか?

4

1 に答える 1

19

perlvarを参照してください:

    $ARGV

Contains the name of the current file when reading from <> .

$.しかし、perlvarについても考慮してください。これを行うと、ユースケースでカウンターがリセットされないperl -nため、希望どおりにならない可能性があります。perl -n

$.

最後にアクセスされたファイルハンドルの現在の行番号。

Perl の各ファイルハンドルは、そこから読み取られた行数をカウントします。( の値によっては、$/何が行を構成するかについての Perl の考えがあなたのものと一致しない場合があります。) 行が (readline()またはを介し​​て<>) ファイルハンドルから読み取られるとき、または その上でtell()またはseek()が呼び出されると、$.その行カウンターのエイリアスになります。ファイルハンドル。

に割り当てることでカウンターを調整できますが$.、実際にはシーク ポインターは移動しません。ローカライズ$.は、ファイルハンドルの行数をローカライズしません。$.代わりに、どのファイルハンドルが現在エイリアス化されているかについての perl の概念をローカライズします。

$.ファイルハンドルが閉じられるとリセットされますが、開いているファイルハンドルが介在せずに再度開かれるとリセットされませんclose()。詳細については、perlop の I/O Operators を参照してください。明示的なクローズを決して行わないため<>、ARGV ファイル全体で行番号が増加します (ただし、eof の例を参照してください)。

HANDLE->input_line_number(EXPR)を使用して、最後にアクセスしたハンドルを気にせずに、特定のファイルハンドルの行カウンターにアクセスすることもできます。

記憶法: 多くのプログラムは "." を使用します。現在の行番号を意味します。

次に例を示します。

$ perl -nE 'say "$., $ARGV";' foo.pl bar.pl
1, foo.pl
2, foo.pl
3, foo.pl
4, foo.pl
5, foo.pl
6, foo.pl
7, foo.pl
8, foo.pl
9, foo.pl
10, foo.pl
11, foo.pl
12, foo.pl
13, bar.pl
14, bar.pl
15, bar.pl

リセットしたい場合eofは、読み取りループの最後でチェックする必要があります(@Borodin に感謝します)。次のperldoceofも参照してください。

$ perl -nE 'say "$., $ARGV"; close ARGV if eof' foo.pl bar.pl
于 2012-11-27T13:12:14.500 に答える