2010-04-28 5 views
1

J'ai ce code Perl:Que se passe-t-il dans cette boucle forl foreach?

foreach (@tmp_cycledef) 
{ 
chomp; 
my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3); 
$cycle_code =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
$close_day =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
$first_date =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 

#print "$cycle_code, $close_day, $first_date\n"; 
$cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ]; 
} 

La valeur de tmp_cycledef provient de la sortie d'une requête SQL:

select cycle_code,cycle_close_day,to_char(cycle_first_date,'YYYY-MM-DD') 
    from cycle_definition d 
    order by cycle_code; 

Ce qui se passe exactement à l'intérieur de la boucle for?

+1

Si vous pouvez donner l'exemple de sortie de sql, la réponse sera plus facile. – Space

Répondre

2

Huh, je ne suis pas surpris de l'un fixe pour vous :)

Il semble que la personne qui a écrit ce essayait de couper les espaces avant et de chaque champ. C'est une façon vraiment étrange de le faire, et pour une raison quelconque, il était trop préoccupé par les espaces intérieurs dans chaque domaine en dépit de ses ancres.

Je pense que cela devrait être le même que tailler les espaces autour du séparateur dans le split:

foreach (@tmp_cycledef) 
    { 
    s/^\s+//; s/$//; #leading and trailing whitespace on the whole string 
    my ($cycle_code, $close_day, $first_date) = split(/\s*\|\s*/, $_, 3); 

    $cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ]; 
    } 

La clé de la réflexion sur split envisage quelles parties de la chaîne que vous voulez jeter, pas seulement ce qui sépare les champs que vous voulez.

0

Pour une partie regex, s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/ faire dépouiller de tête et de queue

espaces blancs
+0

merci de l'expliquer plus clairement – Vijay

+0

$ variable = ~ s/something/somethingelse/ c'est une expression rationnelle de substitution qui trouve quelque chose et la remplace par quelque chose d'autre: il y a plein de choses sur les regex qui sont formatées sur le web. – thenoviceoof

+1

Le découpage des espaces est beaucoup plus facile avec Scalar :: Util :: trim. – Ether

-1

mon dieu, il a été si longtemps depuis que je l'ai lu perl ... mais je vais vous donner un coup de feu.

vous récupérez un enregistrement de @tmp_cycledef, et vous coupez le retour à la ligne, et vous le divisez en trois variables: alors, comme le dit S.Mark, chaque expression régulière de substitution supprime les espaces de début et de fin de la trois variable. Finalement, les valeurs sont poussées dans un hachage sous la forme d'une liste, avec du code de débogage commenté juste au-dessus.

HTH

+0

$ cycledef {$ cycle_code} = [$ close_day, split (/ - /, $ premier_date)]; pouvez-vous me dire ce qui se passe dans cette ligne? – Vijay

+0

Lire l'article de Lohrun – thenoviceoof

0

Chaque ligne @tmp_cycledef se compose d'une chaîne formatée suivante "cycle_code | close_day | first_date".

my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3); 

Divisez la chaîne en trois parties. Les expressions régulières suivantes sont utilisées pour décaper les espaces avant et arrière. La dernière instruction de la boucle crée une entrée dans le dictionnaire $cycledef indexée par $cycle_code. L'entrée est formatté est formaté selon le schéma suivant:

[ $close_day, YYYY, MM, DD ] 

$first_date = "YYYY-MM-DD".

0

@tmp_cycledef: La sortie de la requête SQL est stockée dans ce tableau

foreach (@tmp_cycledef): Pour chaque élément de ce tableau. Supprime le caractère \ n de la fin de chaque élément.

chomp :

my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3); 

diviser les éléments en 3 parties et affecter la variable à chacun des éléments scindés. les parties de division sont "split (/ PATTERN /, EXPR, LIMIT)"

$cycle_code =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
$close_day =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
$first_date =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 

Cette pièce d'expressions rationnelles est sripping d'attaque et de fuite des espaces à partir de chaque variable.

+0

pourquoi bas vote ??? Si vous pensez que n'importe quel problème avec la réponse pourquoi vous ne le mettez pas ici? – Space

-1
  • Votre requête donne un ensemble de lignes sont stockées dans le tableau @tmp_cycledef.
  • Nous itérons sur chaque ligne dans le résultat en utilisant: foreach (@tmp_cycledef).
  • Les lignes de résultat peuvent avoir newline char, nous nous en débarrassons en utilisant chomp.
  • Ensuite, nous split la rangée (qui ne sont pas en $_) sur le tuyau et classer les 3 premières pièces à $cycle_code, $close_day et $first_date respectivement.
  • Les pièces fendues pourraient avoir conduit et de fuite des espaces blancs, les 3 prochains lignes doivent enlever le premier plan et espace blanc dans fuite les 3 variables .
  • Enfin, nous faisons une entrée dans le hachage %cycledef. L'utilisation clé est $cycle_code et la valeur est un tableau dont le premier élément est $close_day et reste des éléments sont des pièces obtenu après le fractionnement sur $first_date trait d'union.
Questions connexes