0

私が書いたプログラムは、ディレクトリとサブディレクトリ内のすべてのファイルを 1 行ずつ調べて、$counter を含むいくつかのコマンドを実行します。すべての行が次のようになる .txt ファイルを作成したいと思います。

<file name> <$counter in the beginning of the file>

たとえば、ファイル a に 3 つのファイル a.txt 、 b.txt 、および c.txt がある場合、カウンターはファイル b で 10 をカウントし、ファイル b で 20 をカウントし、ファイル c で 30 をカウントします。ファイルは次のようになります。

a.txt 0
b.txt 10
c.txt 20

私のプログラムは次のようになります。

use strict;
use warnings;
use File::Find;

my $dir = "C:/New Folder";   
open (MYFILE, '>>data.txt');

# fill up our argument list with file names:
find(sub { if (-f && /\.[c]$/) { push @ARGV, $File::Find::name } }, $dir);
$^I = ".bak";   # supply backup string to enable in-place edit  

foreach $argvv(@ARGV)
{
  while (<>) 
  {
     if ($prev_arg ne $argvv)
     {
       print MYFILE  "$argvv $counter\n";
       $prev_arg = $argvv;
     }   

     #some unrelated line by line code here
     close (MYFILE); 
  }
}

私がやろうとしていたのは、ファイルの処理が終了して別のファイルを開始するたびに、プログラムにファイル名とカウンターを出力させることです。

取得した data.txt ファイルは、最初のファイルの名前と、ディレクトリ内の各ファイルの各行に出力されたカウンターです。言うまでもなく、私は Perl の初心者なので、助けていただければ幸いです。

ありがとう :)

4

1 に答える 1

0

コードにはいくつかの問題があります。

  • strictandを使用していますが、 andwarningsを宣言していません。警告はそれらについてあなたに伝えました。$prev_arg$argvv
  • 読み取り用にファイルを開くことはありません。代わりに、-iコマンド ライン スイッチと引数リストを使用して から読み取ろうとしSTDINます。それは私には意味がありません。代わりに、通常の配列を使用して、ファイルを 1 つずつ開く必要があります。
  • あなたは昔ながらの裸のファイルハンドルとopen. 代わりに、グローバルではなく、周囲のブロックにのみ存在するレキシカル ファイルハンドルを使用してください。openセキュリティ上の問題に遭遇しないように、引数が 3 つの形式を使用してください。ここを参照してください。

これを試して:

use warnings;
use strict;
use File::Find;

my $dir = 'D:/temp';   

my @files;
find(
  sub {
    if (-f && /\.c.txt$/) {
      push @files, $File::Find::name }
    },
  $dir
);

open my $fh_out, '>>', 'data.txt'   # open the output filehandle
  or die $!; 
foreach my $file (@files) {         # iterate the file list
  open my $fh_in, '<', $file        # open the current file for reading
    or die $!; 
  my $counter = <$fh_in>;           # read the first line
  chomp $counter;                   # remove trailing linebreak
  close $fh_in; 
  print $fh_out "$file $counter\n"; # close the input filehandle (explicit)
}
close $fh_out;                      # close the output filehandle
于 2013-02-05T21:09:02.877 に答える