• # J'ai gagné quoi ?

    Posté par . 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.