perl数组用于非零值

时间:2013-03-04 17:07:30

标签: perl

我试图基于“ps”编写“服务”脚本。 我的代码:

#!/usr/bin/perl
use strict;
use warnings;
die "usage:    $0 <service name>\n" unless $ARGV[0];
my $service = $ARGV[0];
open(my $ps, "ps -aux |") || die "Uknown command\n";
my @A = <$ps>;
close $ps;
foreach my $i(grep /$service/, @A){
    chomp $i;
    if($i=~ /root/){
        next
    }
    print "$i\n";
}

我的问题:当针对undef arg运行脚本时,如:

$0 blablabla 

如果没有出现此类服务/返回0,我想返回输出 感谢

4 个答案:

答案 0 :(得分:2)

如果我理解正确,您想通知用户是否找不到此类服务?如果是这样,您可以按如下方式修改脚本:

my $printed;                        # Will be used as a flag.
foreach my $i(grep /$service/, @A){
    chomp $i;
    if($i=~ /root/){
        next
    }
    $printed = print "$i\n";        # Set the flag if the service was found.
}
warn "No service found\n" unless $printed;

答案 1 :(得分:2)

我假设你要问的是:如果找不到匹配的行,如何给出正确的信息?

好吧,只需将结果存储在数组中:

my @lines = grep { !/root/ && /$service/ } @A;

if (@lines) {   # if any lines are found
    for my $line (@lines) {
        ...
    }
} else {
    print "No match for '$service'!\n";
}

或者您可以打印匹配的数量,无论其数量如何:

my $found = @lines;
print "Matched found: $found\n";

另请注意,您可以在grep中添加root检查。

作为旁注,这一部分:

die "usage:    $0 <service name>\n" unless $ARGV[0];
my $service = $ARGV[0];

或许写得更好

my $service = shift;
die "usage ...." unless defined $service;

具体检查参数是否定义,而不是真实。

答案 2 :(得分:1)

您可以尝试这样的事情:

my @processes = grep /$service/, @A;
if ( scalar @processes ) {
    foreach my $i( @processes ){
        chomp $i;
        if($i=~ /root/){
            next;
        }
        print "$i\n";
    }
}
else {
    print 'your message';
}

答案 3 :(得分:0)

您可以在grep循环中遍历for循环之前检查... my @services = grep { m/$service/ } @A; # Filter the perl process running this script and... if ( ! @services ) { print "No service found\n"; exit 0; } foreach my $i( @services ){ ... } 命令的结果,如:

grep

考虑到perl命令永远不会给出错误的返回,因为它包含{{1}}进程,因此您必须对其进行过滤,但我希望您明白这一点。