5

Perl では、パターンに一致するファイルのリストを取得できます。

my @list = <*.txt>;
print  "@list";

ここで、パターンを変数として渡したいと思います (関数に渡されるため)。しかし、それはうまくいきません:

sub ProcessFiles {
  my ($pattern) = @_;
  my @list = <$pattern>;
  print  "@list";
}

readline() on unopened filehandle at ...

助言がありますか?

4

4 に答える 4

12

グロブを使用する:

use strict;
use warnings;

ProcessFiles('*.txt');

sub ProcessFiles { 
  my ($pattern) = @_; 
  my @list = glob $pattern;
  print  "@list"; 
} 

I / Oオペレーターから、警告が表示される理由の説明は次のとおりです。

山かっこに含まれるものが単純なスカラー変数(たとえば、$ foo)である場合、その変数には入力元のファイルハンドルの名前が含まれます...内部関数をglob($ foo)として直接呼び出す方がクリーンであると見なされます。そもそもそれを行うにはおそらく正しい方法です。)

于 2010-02-15T03:51:14.893 に答える
0

ファイルのリストの配列参照を関数に渡してみませんか?

my @list = <*.txt>;
ProcessFiles(\@list);

sub ProcessFiles {
    my $list_ref = shift;
    for my $file ( @{$list_ref} ) {
        print "$file\n";
    }
}
于 2010-02-15T03:45:02.340 に答える
0
use File::Basename;
@ext=(".jpg",".png",".others");
while(<*>){
 my(undef, undef, $ftype) = fileparse($_, qr/\.[^.]*/);
 if (grep {$_ eq $ftype} @ext) {
  print "Element '$ftype' found! : $_\n" ;
 }
}
于 2010-02-15T03:59:00.300 に答える
-1

「eval」コマンドでラップするのはどうですか?このような...

sub ProcessFiles {
  my ($pattern) = @_;
  my @list;
  eval "\@list = <$pattern>";
  print @list;
}
于 2010-02-15T03:38:34.793 に答える