Perl - 正则表达式产生奇怪的结果

时间:2015-05-19 12:10:17

标签: regex perl

我正在运行一个运行Linux系统命令的Perl脚本,即UPDATE ... SET `ForumCategory`.`reply_count` = 8 WHERE `ForumCategory`.`id` = 0 ,以便列出已停止的服务和当前正在运行的服务。我正在使用的代码运行系统命令,然后将输入选择为数组。接下来,代码应该检查用户所承诺的服务是正在运行还是已停止,这是使用产生正确结果的正则表达式完成的。问题在于程序列出的附加信息,即service --status-all等行,有时会打印出几行相同的结果。

我正在运行的代码如下:

dnsdomainname: Unknown host

系统命令产生如下结果:

use warnings;
use strict;

#Looping variables
my $service_query = 1;

#Command
my $command_3 = "service --status-all";

#Input variables
my $service = 0;

while ($service_query == 1){    
    print "Please choose the service that you wish to analyze (Named service):\n";
    $service = <>;

    if ($service =~ /^[a-zA-Z0-9.:_-]+$/)
    {
        $service_query = 0;
    }
    else
    {
        print "Argument not allowed.\n";    
    }   
}

chomp(my @service_data_1 = qx/$command_3/);
chomp($service);

foreach my $line4(@service_data_1) #Filter output according to "$service".
{

    if ($line4 =~ /$service\s\Spid\s[0-9]+\S\s(\S+)/)
    {
        print "1 $service is running\n";
    }
    elsif ($line4 =~ /$service\sis\s(\S+)/)
    {
        print "0 $service has stopped\n";
    }
}

我想列出的内容:

用户输入sandbox is stopped rpc.svcgssd is stopped rpcbind (pid 1284) is running... saslauthd is stopped openssh-daemon (pid 1593) is running... wpa_supplicant (pid 1444) is running... ,程序应打印:sandbox

我真正得到的是:

用户输入沙箱,程序打印:

0 sandbox has stopped

感谢您对此事的任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

service命令最有可能清除环境并执行其他操作以确保在service.d目录中基本上是shell脚本的结果一致。实际上service本身可能是一个shell脚本(通常是我很久以前使用Linux的时候)。您可以检查它以帮助弄清楚您看到dnsdomainname: Unknown host的原因(可能是由于$HOSTNAME等环境变量被清除,或/etc/hosts中缺少通常不会的名称例如,service命令是一个问题。

关于@ choroba的查询,当您在shell中运行service --status-all时,您在控制台上看到的输出可能与您在perl脚本中从qx/ /得到的输出不同,因为service 1}}本身处理STDOUT和STDERR。

来自perdoc -f qx cf。 @ TLP的评论):

  

要分别读取命令的STDOUT和STDERR,它就是               最简单的方法是将它们分别重定向到文件,然后从中读取               程序完成后的那些文件。

如果您愿意使用CPAN模块,另一种方法是Capture::Tiny,它是从perl代码或外部命令中获取所需内容的绝佳工具。