2

ARGVで指定された各(小さな)ファイルを独自の配列で読み取ってほしい。テストしない場合は$ARGV<>1つのテーブル内のすべてのファイルを丸呑みします。それを行うためのより良い/より短い/より簡単な方法はありますか?

# invocation: ./prog.pl *.txt

@table = ();
$current = "";
while (<>)
{
  if ($ARGV ne $current)
  {
    @ar = ();
    $current = $ARGV;
    if ($current)
    {
      push @table, \@ar;
    }
  }
  push @ar;
}
4

4 に答える 4

7

このeof関数を使用して、各ファイルの終わりを検出できます。

#!/usr/bin/env perl

use strict;
use warnings;

my @files;
my $file_ctr = 0;
while (<>) {
    chomp;
    push @{ $files[$file_ctr] }, $_;
}
continue { $file_ctr++ if eof }

関連ドキュメント:

while (<>)ループ内で、eofまたはeof(ARGV)各ファイルの終わりを検出するために使用できますが、最後eof()ファイルの終わりのみを検出します。

于 2012-07-30T14:15:36.900 に答える
3

常に use strictプログラムのuse warnings先頭で、を使用して最初の使用ポイントに近い変数を宣言してくださいmy

ファイルハンドルでファイルの終わりをテストしてARGV、新しいファイルがいつ開かれるかを判断するのが最も簡単です。

このコードは、状態変数を使用して前のファイルが完全に読み取られたかどうかを記録し、リストの最後に達したとき$eofに配列に新しい要素を不必要に追加しないようにします。@table@ARGV

use strict;
use warnings;

my @table;
my $eof = 1;

while (<>) {
  chomp;
  push @table, [] if $eof;
  push @{$table[-1]}, $_;
  $eof = eof;
}

フラグを設定する代わりにファイルの終わりでインデックスをインクリメントするという@AlanHaggaiAlaviのアイデアは、各ファイルの先頭に空の配列を明示的に作成する必要がないため、はるかに優れています。

これが彼の解決策についての私の見解ですが、それは完全にアランのポストに依存しており、彼はそれの功績を認められるべきです。

use strict;
use warnings;

my @table;
my $index = 0;

while (<>) {
  chomp;
  push @{$table[$index]}, $_;
  $index++ if eof;
}
于 2012-07-30T14:30:58.400 に答える
2

File :: Slurpを利用して、自分でファイルを開いたり閉じたりすることを回避できます。

use strict;
use warnings;

use File::Slurp;

my @table = ();

foreach my $arg ( @ARGV ) {
   push @table, read_file( $arg, array_ref => 1 );
}
于 2012-07-30T14:16:46.020 に答える
2

ファイルの配列参照のハッシュ:

my %files;
while (<>) {
  push @{$files{$ARGV}}, $_;
}
于 2012-07-30T14:08:40.000 に答える