Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Programmation et administration système
Programmation et administration système Vos questions sur les scripts d'administration système, création de compte utilisateur, socket, fork, ping, etc...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/11/2012, 13h31   #1
dubis
Membre du Club
 
Inscription : octobre 2007
Messages : 165
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 165
Points : 57
Points : 57
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....
dubis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 14h09   #2
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
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.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 14h23   #3
dubis
Membre du Club
 
Inscription : octobre 2007
Messages : 165
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 165
Points : 57
Points : 57
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.....
dubis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 15h47   #4
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 642
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 642
Points : 3 093
Points : 3 093
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.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h43.


 
 
 
 
Partenaires

Hébergement Web