Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre régulier
    Inscrit en
    octobre 2007
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : octobre 2007
    Messages : 196
    Points : 71
    Points
    71

    Par défaut if grep ne fonctionne pas

    Bonjour,
    J'ai le script suivant qui utilise le CPAN Proc:rocessTable :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Proc::ProcessTable;
    #use POSIX qw(strftime);
     
     
    my $FORMAT = "%-6s %-10s %-8s %-24s %s\n";
    my $t = new Proc::ProcessTable;
    foreach my $p ( @{$t->table} ){
            if (grep (/EMPIRE/, @{$p->cmndline} )) {
                    printf($FORMAT, "PID", "TTY", "STAT", "START", "COMMAND");
                    printf($FORMAT,
                    $p->pid,
                    $p->ttydev,
                    $p->state,
                    scalar(localtime($p->start)),
                    $p->cmndline);
            }
    }
    Il me revoie l'erreur suivante :
    Can't use string ("init [5] ") as an ARRAY ref while "strict refs" in use at ./Monitor_process.pl line 11.

    Je pense que cela vient que le mot clé EMPIRE est contenu dans un PATH avec des slash, j'ai donc essayé plusieurs façon du style avec /*EMPIRE*/ ou /^EMPIRE/ sans sucés. Je n'ai pas trouvé de doc adapté à mon cas.

    Merci de votre aide....

  2. #2
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 2 963
    Points : 3 387
    Points
    3 387

    Par défaut

    Ton erreur provient sans doute de l'usage de ce déréférencement @{$p->cmndline}. Tu tentes ainsi d'atteindre les éléments d'un tableau dont la référence serait retournée par $p->cmndline, or cette méthode semble retourner une chaine scalaire.

    Peut-être devrais-tu écrire à la place : split /\s+/, $p->cmndline
    ou tout simplement remplacer le grep par : $p->cmndline =~ /EMPIRE/
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Using strict and warnings is good for you.

  3. #3
    Membre régulier
    Inscrit en
    octobre 2007
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : octobre 2007
    Messages : 196
    Points : 71
    Points
    71

    Par défaut

    Merci Philou,

    En effet j'ai modifié la ligne 11 comme ceci :
    Code :
           if (grep (/EMPIRE/, split /\s+/, $p->cmndline)) {
    ou comme ceci :
    Code :
    if ($p->cmndline=~ /EMPIRE/ ) {
    J’obtiens le résultat que j'attend.

    C'est l'écriture de la fonction $p->cmndline qui me perturbait.....

  4. #4
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 2 963
    Points : 3 387
    Points
    3 387

    Par défaut

    Pour ne pas être perturbé, il est préférable de ne pas omettre les () lors de l'appel des méthodes :

    Code :
    if ($p->cmndline() =~ /EMPIRE/ ) {
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Using strict and warnings is good for you.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •