IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

if grep ne fonctionne pas


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut if grep ne fonctionne pas
    Bonjour,
    J'ai le script suivant qui utilise le CPAN Proc:rocessTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    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é
    Si c'est utile, say

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Philou,

    En effet j'ai modifié la ligne 11 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           if (grep (/EMPIRE/, split /\s+/, $p->cmndline)) {
    ou comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é
    Si c'est utile, say

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

Discussions similaires

  1. [PERL] un grep qui ne fonctionne pas bien
    Par LE NEINDRE dans le forum Langage
    Réponses: 6
    Dernier message: 03/11/2005, 16h37
  2. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo