Perl正则表达式匹配`w -hs`命令的输出

时间:2010-06-06 18:40:40

标签: regex perl backticks

我正在尝试编写一个Perl脚本,它可以更好地使用KDE的kwrited,据我所知,它连接到pts并通过它接收它接收的每一行KDE系统托盘通知,标题为“KDE write daemon”。

不幸的是,它会针对每一行发出单独的通知,因此它会在常规旧write上使用多行消息向系统托盘发送垃圾邮件,并且由于某种原因,它会切断邮件的整个最后一行。使用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 个答案:

答案 0 :(得分:4)

您只提供一个命令行参数(字符串“Testing 1 2 3”)。

所以$ ARGV [1]是undef。

因为$device内的逻辑,所以if ($ARGV[0] ne "")是undef。

所以你的shell的echo命令重定向到空(“echo something >”),因此shell抱怨(这也是“未定义$ device”Perl警告的地方)。

如果您将设备设为“1”,则在命令行上取消引用参数字符串(perl write.pl Testing 1 2 3)。

另外,请考虑打开$ device作为文件,以便将“$ message”写入文件句柄。这是一个更加惯用的Perl,并且不太容易出现perl-to-shell转换/引用/等等问题......

答案 1 :(得分:0)

问题是你的'尝试系统调用。 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"`

所以你的shell调用永远不会发生。修复方法是将shell调用更改为更像这样的内容:

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 HERE

中阅读有关运算符的不同引用

有一个反引号,系统和shell教程HERE