2010-06-06 3 views
0

J'essaye d'écrire un script Perl qui fonctionnera mieux avec le kwrited de KDE, qui, pour autant que je sache, est connecté à un pts et place chaque ligne reçoit via le système KDE des notifications avec le titre "KDE write daemon". Malheureusement, il fait une notification distincte pour chaque ligne, donc il spams up la barre d'état système avec des messages multilignes sur le vieux write et, pour une raison quelconque, il coupe toute la dernière ligne du message en utilisant wall. Les messages d'une ligne sont également englobés. Je souhaitais également faire en sorte qu'il puisse diffuser sur un réseau local avec des clients lourds. Avant de commencer (ce qui nécessiterait SSH, bien sûr), j'ai essayé de faire une version sans SSH pour m'assurer que cela fonctionne. Malheureusement, il ne fonctionne pas:Perl regex correspondant à la sortie de la commande `w -hs`

perl ./write.pl "Testing 1 2 3" 

où ce qui suit est le contenu de ./write.pl:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $message = ""; 
my $device = ""; 
my $possibledevice = '`w -hs | grep "/usr/bin/kwrited"`'; #Where is kwrited? 
$possibledevice =~ s/^[^\t][\t]//; 
$possibledevice =~ s/[\t][^\t][\t ]\/usr\/bin\/kwrited$//; 
$possibledevice = '/dev/'.$possibledevice; 
unless ($possibledevice eq "") { 
    $device = $possibledevice; 
} 

if ($ARGV[0] ne "") { 
    $message = $ARGV[0]; 
    $device = $ARGV[1]; 
} 
else { 
    $device = $ARGV[0] unless $ARGV[0] eq ""; 
    while (<STDIN>) { 
     chomp; 
     $message .= <STDIN>; 
    } 
} 

if ($message ne "") { 
    system "echo \'$message\' > $device"; 
} 
else { 
    print "Error: empty message" 
} 

produit l'erreur suivante:

$ perl write.pl "Testing 1 2 3" 
Use of uninitialized value $device in concatenation (.) or string at write.pl line 29. 
sh: -c: line 0: syntax error near unexpected token `newline' 
sh: -c: line 0: `echo 'foo' > ' 

D'une certaine façon, les expressions régulières et/ou l'échappement arrière dans le traitement $possibledevice ne fonctionne pas correctement, car où kwrited est connecté à /dev/pts/0, les éléments suivants rks parfaitement:

$ perl write.pl "Testing 1 2 3" /dev/pts/0 

Répondre

4

Vous ne fournissez qu'un seul argument de ligne de commande (chaîne "Testing 1 2 3").

Donc $ ARGV [1] est undef.

Donc $device est indéfini à cause de la logique if ($ARGV[0] ne ""). Ainsi, la commande echo de votre shell ne redirige vers rien ("echo something >") et donc shell se plaint (et c'est là aussi l'avertissement Perl "undefined $ device").

Si vous voulez dire que le périphérique est "1", vous devez alors dé-citer votre chaîne d'argument (perl write.pl Testing 1 2 3) sur la ligne de commande.

En outre, s'il vous plaît envisager d'ouvrir $ device comme un fichier pour l'écriture et l'impression de "$ message" à la poignée de fichier. C'est un peu plus idiomatique que Perl et moins sujet aux problèmes de transitions perl-to-shell/quoting/etc ...

+0

L'ajout de plusieurs éléments dans les conditions de traitement des arguments l'a corrigé. Les expressions rationnelles ont eu besoin de quelques modifications, mais cela fonctionne maintenant. Merci beaucoup! – mmirate

0

Un problème est votre ' autour de l'appel système tenté. Aucune interpolation n'a lieu entre guillemets simples en Perl.

Si vous regardez un cas simple:

#!/usr/bin/perl 

use strict; 
use warnings; 


my $possibledevice = '`w -hs | grep "/usr/bin/kwrited"`'; #Where is kwrited? 
print $possibledevice; 

La sortie est:

`w -hs | grep "/usr/bin/kwrited"` 

donc votre appel shell se déroule jamais. La solution est de changer l'appel shell à quelque chose comme ceci:

my $possibledevice = `w -hs | grep \"/usr/bin/kwrited\"`; #shud b there... 
#or 
my $possibledevice = qx$w -hs | grep \"/usr/bin/kwrited\"$; #alternate form 

Vous pouvez lire sur les différents devis comme opérateurs dans perlop ou à perldoc HERE

Il y a un backtick, système et tutoriel shell HERE

+0

J'ai essayé ça tout à l'heure, sans effet: j'obtiens exactement la même erreur. Quelque chose ne va pas avec les regex. – mmirate

+0

DVK a l'autre partie de la solution ci-dessous ... Vous avez encore besoin de changer vos citations shell ou rien ne se passera. – dawg