$ ls -lRa
.:
total 1632
drwxr-xr-x 3 jmfayard jmfayard 4096 2003年12月02日 20:07 .
drwxr-xr-x 75 jmfayard jmfayard 4096 2003年12月02日 20:02 ..
-rw-r--r-- 1 jmfayard jmfayard 50750 2003年11月09日 17:17 a
[... idem ...]
./Tests:
total 420
drwxr-xr-x 2 jmfayard jmfayard 4096 2003年11月09日 18:01 .
drwxr-xr-x 3 jmfayard jmfayard 4096 2003年12月02日 20:07 ..
-rw-r--r-- 1 jmfayard jmfayard 2076 2003年11月09日 18:01 pat2.xml
[... idem ...]
$ perl -e 'TRUC' ==> excuter l'argument TRUC et non pas un fichier
$ perl -lap
Equivalent de
#!/usr/bin/perl
while( <> ) { # perl -p : on fait une boucle autour de
# chaque ligne de STDIN ou des fichiers en arguments
chomp; # perl -l : on limine la fin de ligne
@F = split; # perl -a : F contient la liste des mots de la ligne courante
[... reste du script en argument ici ... ]
print ; # perl -p ["print"] : on affiche la ligne $_ modifie par le script
# prcdent.
# perl -n fait aussi une boucle autour du programme sans imprimer
# automatiquement la fin.
}
Donc on analyse chaque ligne sachant que la liste des mots se trouvent dans @F
Reste analyser le reste du script :
$ /^total/?$x+=$F[1]:$x}{$_=$x'
Arghh
Segmentation Fault de mon cerveau.
Core Dumped
Bon avanons pas pas :
on peut arriver reconnatre la structure (...) ? (...) : (...)
qui vient du C.
La condition est facile :
/^total/ ==> si la ligne courante commence par total
Si elle est remplie, on excute :
$x += $F[1]
Bon, c'est clair, on a un compteur qui additione le deuxime mot aprs total
Dans mon exemple :
[...]
total 1632
[...]
total 420
[...]
Sinon, on excute :
$x}{$_=$x
Vous ne rvez pas, a ne veut rien dire.
Il y a un vieux hack l-dessous. Reprenons, perl -p -e SCRIPT correspond en fait :
#!/usr/bin/perl
while( <> )
{
SCRIPT
print $_;
}
Que se passe-t'il s'il y a "}{" dans SCRIPT ?
Disons : SCRIPT ::= DEBUT "}" "{" CONTINUE
Notre code correspond maintenant :
#!/usr/bin/perl
while( <> )
{
DEBUT
}
{
CONTINUE
print $_;
}
Astucieux et dgeulasse, non ?
C'est pour cel que CONTINUE correspond :
$_ = $x ; # notre brave compteur qu'il faut imprimer.
Voil, cette fois on a tout, la version lisible est :
#!/usr/bin/perl -w
use Strict;
my $x = 0; # compteur
my $ligne;
while( $ligne=<> )
{
chomp;
@F = split / */, $ligne ;
if ( $ligne =~ /^total)
{
$x += $F[1] ;
}
}
{
print $x;
}
PS: Le copier-coller sous Linusque suxor. Il n'y a pas que le plain ascii dans la vie.
# J'ai gagné quoi ?
Posté par jmfayard . En réponse au journal du en perl. Évalué à 6.
$ ls -lRa .: total 1632 drwxr-xr-x 3 jmfayard jmfayard 4096 2003年12月02日 20:07 . drwxr-xr-x 75 jmfayard jmfayard 4096 2003年12月02日 20:02 .. -rw-r--r-- 1 jmfayard jmfayard 50750 2003年11月09日 17:17 a [... idem ...] ./Tests: total 420 drwxr-xr-x 2 jmfayard jmfayard 4096 2003年11月09日 18:01 . drwxr-xr-x 3 jmfayard jmfayard 4096 2003年12月02日 20:07 .. -rw-r--r-- 1 jmfayard jmfayard 2076 2003年11月09日 18:01 pat2.xml [... idem ...] $ perl -e 'TRUC' ==> excuter l'argument TRUC et non pas un fichier $ perl -lap Equivalent de #!/usr/bin/perl while( <> ) { # perl -p : on fait une boucle autour de # chaque ligne de STDIN ou des fichiers en arguments chomp; # perl -l : on limine la fin de ligne @F = split; # perl -a : F contient la liste des mots de la ligne courante [... reste du script en argument ici ... ] print ; # perl -p ["print"] : on affiche la ligne $_ modifie par le script # prcdent. # perl -n fait aussi une boucle autour du programme sans imprimer # automatiquement la fin. } Donc on analyse chaque ligne sachant que la liste des mots se trouvent dans @F Reste analyser le reste du script : $ /^total/?$x+=$F[1]:$x}{$_=$x' Arghh Segmentation Fault de mon cerveau. Core Dumped Bon avanons pas pas : on peut arriver reconnatre la structure (...) ? (...) : (...) qui vient du C. La condition est facile : /^total/ ==> si la ligne courante commence par total Si elle est remplie, on excute : $x += $F[1] Bon, c'est clair, on a un compteur qui additione le deuxime mot aprs total Dans mon exemple : [...] total 1632 [...] total 420 [...] Sinon, on excute : $x}{$_=$x Vous ne rvez pas, a ne veut rien dire. Il y a un vieux hack l-dessous. Reprenons, perl -p -e SCRIPT correspond en fait : #!/usr/bin/perl while( <> ) { SCRIPT print $_; } Que se passe-t'il s'il y a "}{" dans SCRIPT ? Disons : SCRIPT ::= DEBUT "}" "{" CONTINUE Notre code correspond maintenant : #!/usr/bin/perl while( <> ) { DEBUT } { CONTINUE print $_; } Astucieux et dgeulasse, non ? C'est pour cel que CONTINUE correspond : $_ = $x ; # notre brave compteur qu'il faut imprimer. Voil, cette fois on a tout, la version lisible est : #!/usr/bin/perl -w use Strict; my $x = 0; # compteur my $ligne; while( $ligne=<> ) { chomp; @F = split / */, $ligne ; if ( $ligne =~ /^total) { $x += $F[1] ; } } { print $x; }PS: Le copier-coller sous Linusque suxor. Il n'y a pas que le plain ascii dans la vie.