Forum Programmation.perl méta caractère "\("

Posté par  .
Étiquettes : aucune
0
15
fév.
2010
Bonjour,

Comment faire passer les méta caractère tel que "(" dans le script suivant :

#!/usr/bin/perl -w
$who = `who | grep -v \(:`;
print "$who";



J'aimerais reprendre ce bout de code pour faire mon watchlog perso... mais il bloque à la parenthèse après le grep.
Dans le shell cette commande fonctionne très bien.

Merci de votre aide
  • # pkoi perl ?

    Posté par  . Évalué à 2.

    pkoi faire en perl alors que bash suffirait ?

    ensuite il doit falloir faire un
    grep -v ' chaine '
    • [^] # Re: pkoi perl ?

      Posté par  (site web personnel) . Évalué à 2.

      Je dirais plutôt, pourquoi utiliser perl si c'est pour invoquer des programmes externes (et surtout grep !) ?

      open WHO, "|-", "who";
      while (<$who>) {
      next if m/\(:/;
      my ($user) = split;
      print "$user est connecté\n";
      }
      close $who;
  • # enlever le grep ...

    Posté par  (site web personnel) . Évalué à 2.



    #!/usr/bin/perl -w
    my @who = `who`;
    foreach(@who){
       next if($_=~m/\(:/);
       print $_;
    }

  • # un grep peut faire l'affaire...

    Posté par  . Évalué à 2.

    #!/usr/bin/perl -w
    $who = `who | grep -v '(:'` ;
    print $who;

  • # perl is good

    Posté par  . Évalué à 3.

    et vachement pratique !

    Il y a deux règles que je m'applique continuellement en perl :
    - ne jamais utiliser /bin/grep
    - ne jamais utiliser /bin/sed

    Dans ton cas tu dois pouvoir faire quelque chose comme :
    #!/usr/bin/perl -w

    use strict;

    my $who = (grep {!/(:/} `who`)[0];
    print "$who";


    Tu appelle la commande who tu parse le résultat avec le grep de perl qui renvoie un tableau et tu prend que le premier élément (perl renvoie un tableau). Au niveau des protections je saurais pas te dire mais le problème doit être beaucoup plus simple.

    Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # La solution de base et l’équivalent sans grep externe

    Posté par  . Évalué à 2.

    Comment faire passer les méta caractère tel que "(" dans le script suivant :

    Tu veux quoter la parenthèse pour le shell, pas pour Perl. Et pour envoyer un \ au shell, il faut le quoter lui-même :
    #!/usr/bin/perl -w
    $who = `who | grep -v \\(:`;
    print "$who";

    Cela dit, la remarque de Michel reste très pertinente : il serait stupide d’utiliser des outils externes moins puissants que les fonctions intégrées à Perl (surtout si c’est pour avoir du mal après avec des appels alambiqués…).

    L’équivalent le plus proche :
    #!/usr/bin/perl -w
    use strict;

    my @who = grep !/\(:/, `who`;
    print @who;

    Note : là, le \ n’est pas là pour le shell, mais parce qu’avec un grep moins limité que le grep de base, les parenthèses sont des caractères spéciaux (c’est déjà le cas avec egrep).

    « Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.