Perl - 如何将输入拆分为数组?

时间:2015-08-11 21:29:59

标签: linux perl

我有一个小的Perl脚本,用于获取用户命令行输入,然后将输入拆分为一个数组,其中每个服务应该是它自己的元素。

我的目标是使用分割字符启用单个参数以及多个参数,其中每个参数都用逗号分隔。这些例子如下:

  • SSH
  • SSH,命名,杯

我的代码如下所示,它编译时没有错误,但输出不是预期的。

    print "Please provide the service name that you wish to analyze (Named service):\n";
    print "Several services may be provided, using a comma sign as a separator.\n";

    my $service_name_input = <>;
    chomp($service_name_input);
    my @service_list = split(/,/, $service_name_input);

    foreach my $line (@service_list)
    {
        open(my $service_input, "service @service_list status|");
    }

    foreach my $line (@service_list)
    {
        #Matches for "running".
        if ($line =~ m/(\(running\))/)
        {
            print "The service @service_list is running\n";
        }
        #Matches for "dead".
        elsif ($line =~ m/(dead)/)
        {
            print "The service @service_list is dead\n";
        }
    }

如果服务正在运行或死机,程序应输出,但我只收到以下错误代码。手动发出服务命令时,它可以正常工作。

  

service命令仅支持基本的LSB操作(启动,停止,   restart,try-restart,reload,force-reload,status)。对于其他   请尝试使用systemctl。

对于我为实现工作计划应采取的步骤提供的任何帮助将不胜感激。谢谢你的阅读。

1 个答案:

答案 0 :(得分:2)

foreach my $line (@service_list)
{
    open(my $service_input, "service @service_list status|");
}

此循环不使用$line。您将整个数组@service_list传递给服务命令,即您正在运行service ssh named cups status。这会导致错误,因为service认为您要对named服务执行ssh操作。要解决此问题,请写下"service $line status |"

但还有另外一个问题:你永远不会对$service_input做任何事情。如果要遍历每个服务命令输出的每一行,则需要更多类似的内容:

foreach my $service (@service_list)
{
    open(my $service_input, '-|', 'service', $service, 'status')
        or die "$0: can't run 'service': $!\n";

    while (my $line = readline $service_input)
    {
        #Matches for "running".
        if ($line =~ m/(\(running\))/)
        {
            print "The service $service is running\n";
        }
        #Matches for "dead".
        elsif ($line =~ m/(dead)/)
        {
            print "The service $service is dead\n";
        }
    }
}

我已经更改了您的open行以使用单独的模式参数-|(这是一般的好样式)和进程打开的列表形式,这避免了shell,这是一般情况也不错(例如,#{1}}中没有与#34;特殊字符&#34相关的问题。