Как я могу использовать значение переменной в качестве шаблона glob в Perl? - PullRequest
5 голосов
/ 15 февраля 2010

В Perl вы можете получить список файлов, которые соответствуют шаблону:

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

Теперь я хотел бы передать шаблон как переменную (потому что он передается в функцию). Но это не работает:

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

readline() on unopened filehandle at ...

Есть предложения?

Ответы [ 4 ]

12 голосов
/ 15 февраля 2010

Использование glob :

use strict;
use warnings;

ProcessFiles('*.txt');

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

Вот объяснение, почему вы получаете предупреждение от Операторов ввода-вывода :

Если то, что содержат угловые скобки, простая скалярная переменная (например, $ foo), то эта переменная содержит имя дескриптора файла для ввода from ... считается более чистым вызывать внутреннюю функцию напрямую как glob ($ foo), что, вероятно, является правильным способом сделать это в первую очередь.)

0 голосов
/ 15 февраля 2010
use File::Basename;
@ext=(".jpg",".png",".others");
while(<*>){
 my(undef, undef, $ftype) = fileparse($_, qr/\.[^.]*/);
 if (grep {$_ eq $ftype} @ext) {
  print "Element '$ftype' found! : $_\n" ;
 }
}
0 голосов
/ 15 февраля 2010

Почему бы не передать ссылку на массив списка файлов в функцию?

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

sub ProcessFiles {
    my $list_ref = shift;
    for my $file ( @{$list_ref} ) {
        print "$file\n";
    }
}
0 голосов
/ 15 февраля 2010

Как насчет обернуть его командой "eval"? Вот так ...

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