2009-11-16 5 views
4

Je passais en revue un script Perl écrit par quelqu'un d'autre et je ne connais pas trop Perl alors quelqu'un pourrait-il me dire ce que font les trois premières lignes?Qu'est-ce que ce script Perl réalise?

my $ref = do($filename); 
$ref != 0 or die "unable to read/parse $filename\n"; 
@[email protected]{$ref}; 
foreach $ord (@varLines) 
{ 
    # code here 
} 

C'est au début du programme après l'$filename est réglé à obtenir les arguments de ligne de commande

Le format du fichier en cours transmis à ce script est

[ 
    { 
    "Key1" => "val1", 
    "key2" => " "A", 
    }, 
    { 
    "Key3" => "val2", 
    "key4" => " "B", 
    }, 
] 
+0

Je pense que cela ne fonctionnera pas. Je pense que le 'do' se heurtera à la construction' do ... while'. – Geo

+2

ressemble à il lit le fichier et le divise en un tableau de lignes individuelles –

+0

@Geo: non, la commande 'do' peut également être utilisé pour" source "un autre script Perl. – jheddings

Répondre

12

Il fait ceci:

  • my $ref = do($filename) exécute le code Perl dans le fichier dont le nom est $filename (ref) et assignes à $ref la valeur de la dernière commande dans le fichier
  • $ref != 0 or die … est destiné à avorter si cette dernière commande dans $filename a échoué (voir les commentaires ci-dessous pour la discussion)
  • @[email protected]{$ref}; suppose que $ref est une référence à un tableau et initialise @varLines au contenu de ce tableau
  • foreach $ord (@varLines) { … } réalise un code pour chacun des éléments du tableau, appelant chacun des $ord pendant toute la durée de la boucle

critique, tout dépend de ce qui est en le fichier dont le nom est $filename.

+1

Votre deuxième balle n'est pas tout à fait raison. $ ref est undef si $ filename n'a pas pu être trouvé ou n'a pas pu être compilé. Le chèque devrait vraiment être changé en "défini $ ref ou ...". – jamessan

+0

Bons points, maintenant incorporés. Je vous remercie. :-) – Tim

4

La commande do exécutera le nom de fichier donné en tant que script Perl et retournera la valeur de la dernière expression dans le fichier. Donc, je devine que le fichier sur lequel on agit ici renvoie une référence à un tableau.

Le bloc suivant itère simplement sur les éléments de ce tableau retourné.

+0

Je ne le savais pas. Merci! – Geo

2

perldoc -f do

  • do EXPR

    utilise la valeur de EXPR comme un nom de fichier et exécute le contenu du fichier comme un script Perl.

    do 'stat.pl'; 
    

    est comme

    eval `cat stat.pl`; 
    

    sauf qu'il est plus efficace et concis, garde la trace du nom du fichier en cours pour les messages d'erreur, les recherches si le fichier se trouve les répertoires @INC et mises à jour %INC. Voir "Predefined Names" in perlvar pour ces variables. Il diffère également en ce que le code évalué avec do FILENAME ne peut pas voir les lexiques dans la portée englobante; eval STRING fait. C'est pareil, cependant, en ce qu'il répare le fichier chaque fois que vous l'appelez, donc vous ne voulez probablement pas le faire dans une boucle.

Dans ce cas, il semble qu'il est prévu que le contenu de $filename donnent un résultat de quelque chose comme

[ 
    "line1", 
    "line2", 
    "line3", 
] 

et la boucle foreach traitera alors chaque élément.

Questions connexes