0

これを行うにはもっと簡単な方法があることは知っていますが、ファイルを見つけたときにファイルを操作する必要があるため、これが私がやりたい方法です。

Windows 用の Strawberry Perl を使用しています。

my $baseDir = 'U:\\bin\\';
my $logFile = 'C:\\bintmp\\replace.log';

open(LOG,'>',$logFile);

folder($baseDir);

sub folder {
  my $input = shift; # May be a file or dir

  my @fileList = <$input*>;

  foreach my $file (@fileList) {
    if (-f ($file)) {   
      print LOG basename($file) . "\n";
      next;
    }

    if (-d ($file)) {
      folder($file); # Recursively call the folder function
    }
  }
  return 1;
}
close(LOG);

私は何が起こっているのか知っていると思います。新しいフォルダーにドリルダウンする@fileListと、最下部のディレクトリに配置されるように置き換えられます。このコードは永久に実行されます。

4

1 に答える 1

4

*問題は、 の の前にバックスラッシュがないため、同じディレクトリを検索しglobて検索していることです。U:\bin\XXU:\bin\XX*

また、常に use strictおよびuse warnings;を使用する必要があることにも注意してください。小文字とアンダースコアの識別子は、Perl ローカル変数の事実上の標準です。また、呼び出しが成功することを常に確認する必要があります。open

単一引用符で囲まれた文字列では、複数のバックスラッシュを使用する必要はありません。ただし、バックスラッシュが文字列の末尾にある場合や複数のバックスラッシュが一緒に使用されている場合を除きます。

代わりにこれを試してください

use strict;
use warnings;

use File::Basename 'basename';

my $base_dir = 'U:\bin';
my $log_file = 'C:\bintmp\replace.log';

open(my $log, '>', $log_file) or die $!;

folder($base_dir);

sub folder {

  my ($input) = @_;

  my @file_list = glob "$input\\*";

  foreach my $file (@file_list) {
    if (-f $file) {   
      print $log basename($file), "\n";
    }
    elsif (-d $file) {
      folder($file);
    }
  }
}
于 2013-04-11T12:03:02.927 に答える