5 votes

Comment utiliser la valeur d'une variable comme motif global en Perl ?

En Perl, vous pouvez obtenir une liste de fichiers correspondant à un motif :

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

Maintenant, j'aimerais passer le motif en tant que variable (parce qu'il est passé dans une fonction). Mais cela ne fonctionne pas :

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

readline() on unopened filehandle at ...

Des suggestions ?

12voto

toolic Points 23449

Utilisation glob :

use strict;
use warnings;

ProcessFiles('*.txt');

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

Voici une explication de la raison pour laquelle vous recevez l'avertissement, provenant de Opérateurs d'E/S :

Si ce que les crochets contiennent est une simple variable scalaire (par ex, $foo), alors cette variable contient le nom du fichier à saisir il est considéré comme plus propre d'appeler la fonction interne directement en tant que glob($foo), ce qui est probablement la bonne façon de le faire en premier lieu).

0voto

Alan Haggai Alavi Points 34260

Pourquoi ne pas passer la référence du tableau de la liste des fichiers à la fonction ?

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

sub ProcessFiles {
    my $list_ref = shift;
    for my $file ( @{$list_ref} ) {
        print "$file\n";
    }
}

0voto

ghostdog74 Points 86060
use File::Basename;
@ext=(".jpg",".png",".others");
while(<*>){
 my(undef, undef, $ftype) = fileparse($_, qr/\.[^.]*/);
 if (grep {$_ eq $ftype} @ext) {
  print "Element '$ftype' found! : $_\n" ;
 }
}

-1voto

Robert Wohlfarth Points 1127

Pourquoi ne pas l'entourer d'une commande "eval" ? Comme ceci...

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X