Perl регулярное выражение, совпадающее с выводом команды `w -hs` - PullRequest
0 голосов
/ 06 июня 2010

Я пытаюсь написать Perl-скрипт, который будет лучше работать с kwrited в KDE, который, насколько я могу судить, связан с pts и помещает каждую полученную строку через Уведомления в системном трее KDE с заголовком «Демон записи KDE».

К сожалению, он делает отдельное уведомление для каждой строки, поэтому он забивает системный трей многострочными сообщениями на обычную старую запись и по какой-то причине обрезает всю последнюю строку сообщение при использовании wall . Однострочные сообщения тоже кончены.

Я также надеялся сделать так, чтобы он мог транслироваться по локальной сети с толстыми клиентами. Перед тем, как начать (что, конечно, потребует SSH), я попытался сделать версию без SSH, чтобы убедиться, что она работает. К сожалению, это не так:

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

где следующее является содержанием ./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"
}

выдает следующую ошибку:

$ 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' > '

Каким-то образом регулярные выражения и / или экранирование обратной черты при обработке $possibledevice не работают должным образом, поскольку, если kwrited подключен к /dev/pts/0, следующее прекрасно работает:

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

Ответы [ 2 ]

4 голосов
/ 06 июня 2010

Вы предоставляете только ОДИН аргумент командной строки (строка "Testing 1 2 3").

Так что $ ARGV [1] не определен.

Так что $device не определен из-за логики внутри if ($ARGV[0] ne "").

Таким образом, команда echo вашей оболочки перенаправляется в ничто ("echo something >") и, таким образом, оболочка выдает жалобы (и отсюда и предупреждение Perl "undefined $ device").

Если вы подразумевали, что для устройства задано значение «1», снимите кавычки в строке аргумента (perl write.pl Testing 1 2 3) в командной строке.

Также, пожалуйста, рассмотрите возможность открытия $ device как файла для записи и печати «$ message» в дескриптор файла. Это немного более идиоматичный Perl и менее подверженный проблемам, возникающим из-за переходов из perl в оболочку / цитирование / etc ...

0 голосов
/ 06 июня 2010

Одной из проблем является ваш ' вокруг попытки системного вызова. Внутри одинарных кавычек в Perl нет интерполяции.

Если вы посмотрите на простой случай:

#!/usr/bin/perl

use strict;
use warnings;


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

Вывод:

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

Так что ваш вызов оболочки никогда не происходит. Исправление состоит в том, чтобы изменить вызов оболочки на что-то вроде этого:

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

Вы можете прочитать о различных кавычках, таких как операторы в perlop или в perldoc ЗДЕСЬ

Существует руководство по использованию системы, оболочки и оболочки ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...