Perl : inclusion de awk

Résolu
Bonjour,

Je veux ecrire un script Perl qui liste les fichiers contenus dans un repertoire avec seulement trois champs. Mais ca ne fonctionne pas.

Si j'execute le script suivant, ca fonctionne (il liste tous les champs):

Script 1:

#!/usr/bin/perl
my $rep = "/media/sda5/Informatique/Test/Test_1";
chdir $rep;
my @ls = qx{ls -l $rep};
print "@ls\n";


-------------------------------------------------------------------------------------

Si je rajoute la commande awk, il y a une erreur qui apparait.

Script 2 :

#!/usr/bin/perl
my $rep = "/media/sda5/Informatique/Test/Test_1";
chdir $rep;
my @ls = qx{ls -l $rep | awk '{ print $5,$6,$8 }'};
print "@ls\n";


Resultat :

awk: line 1: syntax error at or near ,

Ou est le probleme?

Merci
Configuration: Linux
Konqueror 3.5

14 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    les variables awk sont prises pour des variables perl, et comme ça ? my @ls = qx{ls -l $rep | awk '{ print \$5,\$6,\$8 }'};
    1. Merci dubcek, je vais essayer cela dans les prochains jours. Trop occupé pour le moment... et pas chez-moi! Je t'en redonne des nouvelles.
      Merci. :-)
      1. Modérateur
        Salut,

        pourquoi pas en Perl (vous que tu veux apprendre ;-)

        lami20j@debserv:~/trash$ cat artagon.pl
        #!/usr/bin/perl
        use strict;use warnings;
        
        my $rep="/home/lami20j/trash/c_exercices";
        opendir REP,"c_exercices"
            or die "E/S :$!\n";
        
        while(my $fic = readdir(REP)){
          next if $fic=~/^\.\.?$/;
          my @stat = (stat("$rep/$fic"))[7,9];
          my ($j,$m,$a) = (localtime($stat[1]))[3..5];
          printf "$stat[0] %04d-%02d-%02d $fic\n",$a+1900,$m+1,$j;
        }
        __END__
        lami20j@debserv:~/trash$ perl artagon.pl
        4096 2008-02-10 3
        543 2008-02-10 functions_date.c
        lami20j@debserv:~/trash$
        et voici le résultat de la commande awk
        lami20j@debserv:~/trash$ ls -l  c_exercices/| awk '{ print $5,$6,$8 }'
        
        4096 2008-02-10 3
        543 2008-02-10 functions_date.c
        

        1. Bonjour,

          Finalement, je peux vous repondre ...trois jours apres. Excusez-moi du retard.

          Premierement, dubcek ta commande marche tres bien.

          Quant a toi, lami20j, tu as monte le degre de difficulte d'une coche (plutot de deux ... :-) ). Cependant, dans mon cas ca n'a pas fonctionne. Je n'ai change que le repertoire. Voici le fichier :

          /Perl$ cat lami20j_3_champs.pl
          #!/usr/bin/perl
          use strict;use warnings;

          my $rep="/media/sda5/Informatique/Test/Test_1";
          opendir REP,"Test_1"
          or die "E/S :$!\n";

          while(my $fic = readdir(REP)){
          next if $fic=~/^\.\.?$/;
          my @stat = (stat("$rep/$fic"))[7,9];
          my ($j,$m,$a) = (localtime($stat[1]))[3..5];
          printf "$stat[0] %04d-%02d-%02d $fic\n",$a+1900,$m+1,$j;
          }
          __END__


          et le resultat :

          /Perl$ perl lami20j_3_champs.pl
          E/S :No such file or directory


          Le repertoire /media/sda5/Informatique/Test/Test_1 existe bel et bien.

          Il va falloir que j'y aille bientot. Encore une fois...

          Eh lami20j, est-ce que tu connais un operateur dans Perl qui allonge les journees de 6 heures. Je pourrais les consacrer a Perl ...

          Merci a vous deux,
          1. Modérateur
            Salut,

            Le repertoire /media/sda5/Informatique/Test/Test_1 existe bel et bien.
            je n'ai pas dit le contraire ;-)

            essaie
            #!/usr/bin/perl
            use strict;use warnings;
            
            my $rep="/media/sda5/Informatique/Test";
            opendir REP,"Test_1"
            or die "E/S :$!\n";
            
            while(my $fic = readdir(REP)){
            next if $fic=~/^\.\.?$/;
            my @stat = (stat("$rep/$fic"))[7,9];
            my ($j,$m,$a) = (localtime($stat[1]))[3..5];
            printf "$stat[0] %04d-%02d-%02d $fic\n",$a+1900,$m+1,$j;
            }
            __END__ 
            1. Modérateur
              qui allonge les journees de 6 heures

              je ne comprends pas ta question
              1. Non lami20j. ca ne fonctionne pas non plus.

                A propos del'operateur : les journees ont 24 heures. Est-ce que tu connais un operateur de Perl qui les allongeraient jusqu'a 30 heures... il ne faut pas me prendre toujours au serieux ... ;-)

                Je dois quitter pour aller travailler.

                Je vais regarder ta reponse demain si possible

                Salut et merci,
                1. Modérateur
                  alors affiche le résultat de

                  #!/usr/bin/perl
                  use strict;use warnings;
                  
                  my $rep="/media/sda5/Informatique/Test";
                  opendir REP,"Test_1"
                  or die "E/S :$!\n";
                  
                  while(my $fic = readdir(REP)){
                    next if $fic=~/^\.\.?$/;
                    print "$rep/$fic\n";
                    #my @stat = (stat("$rep/$fic"))[7,9];
                    #my ($j,$m,$a) = (localtime($stat[1]))[3..5];
                    #printf "$stat[0] %04d-%02d-%02d $fic\n",$a+1900,$m+1,$j;
                  }
                  __END__ 
                  1. Salut lami20j,

                    J'ai essaye ton script soit :

                    #!/usr/bin/perl
                    use strict;use warnings;
                    my $rep="/media/sda5/Informatique/Test";
                    opendir REP,"Test_1"
                    or die "E/S :$!\n";
                    while(my $fic = readdir(REP)){
                    next if $fic=~/^\.\.?$/;
                    print "$rep/$fic\n";
                    }
                    __END__


                    et ca donne toujours le meme resultat, soit E/S :No such file or directory.

                    J'ai observe que le mot REP apparait en noir ordinaire. Habituellement, Kate colorie les caracteres qui font partie d'un mot cle ou d'une variable. Par exemple, dans ton script print est en bleu, my en noir fonce, or en vert, $rep en brun. Ce n'est pas le cas ici. En principe, ca devrait ...

                    Donc, je crois que Perl ne reconnait pas REP. Est-ce que REP est-un mot cle du langage ou une variable? Tu as defini $rep et non $REP.

                    Merci, Aujourd'hui, j'ai finalement du temps ... :-)
                    1. Modérateur
                      Salut,

                      essaie
                      #!/usr/bin/perl
                      use strict;use warnings;
                      my $rep="/media/sda5/Informatique/Test";
                      opendir REP,"Test"
                      or die "E/S :$!\n";
                      while(my $fic = readdir(REP)){
                      next if $fic=~/^\.\.?$/;
                      print "$rep/$fic\n";
                      }
                      __END__ 


                      REP et $rep ne se réfère pas à la même chose ;-)
                      1. Modérateur
                        en fait je pense qu'à l'exécution de script tu n'est pas dans
                        /media/sda5/Informatique/Test

                        donc essaie
                        #!/usr/bin/perl
                        use strict;use warnings;
                        my $rep="/media/sda5/Informatique/Test";
                        opendir REP,"$rep"
                          or die "E/S :$!\n";
                        
                        while(my $fic = readdir(REP)){
                          next if $fic=~/^\.\.?$/;
                          print "$rep/$fic\n";
                        }
                        __END__ 
                        1. Cela a fonctionne cette fois-ci. Effectivement, je mets mes scripts dans un seul repertoire. Je ne veux pas les eparpiller un peu partout. En principe, ca devrait etre la bonne facon de proceder mais j'aurais du le specifier avant ...

                          Merci lami20j,