从文件中读取并将内容与变量进行比较

时间:2011-08-22 15:59:47

标签: perl pattern-matching rpm

#!/usr/bin/perl
some code........
..................
system ("rpm -q iptables > /tmp/checkIptables");
my $iptables = open FH, "/tmp/checkIptables";

上面的代码检查Linux机器中是否安装了iptables?如果已安装,命令rpm -q iptables将提供如下所示的输出:

iptables-1.4.7-3.el6.x86_64  

现在我已将此输出重定向到名为checkIptables的文件。

现在我想检查变量$iptables是否与上面给出的输出匹配。我不关心版本号。

应该是

if ($iptables eq iptables*){
...............
.......................}

但是iptables *会出错。

3 个答案:

答案 0 :(得分:3)

您可以使用正则表达式检查字符串:

$iptables =~ /^iptables/

此外,您不需要tmp文件,您可以改为打开管道:

use strict;
use warnings;
use autodie;

open my $fh, '-|', "rpm -q iptables";
my $line = <$fh>;
if ($line =~ /^iptables/) {
    print "iptables is installed";
}

这将读取输出的第一行,并根据正则表达式进行检查。

或者你可以使用反引号:

my $lines = `rpm -q iptables`;
if ($lines =~ /^iptables/) {
    print "iptables is installed";
}

请注意,反引号可能会返回多行数据,因此您可能需要对其进行补偿。

答案 1 :(得分:1)

我认为你要找的是正则表达式或“模式匹配”。你希望字符串匹配一个模式,而不是特定的东西。

if ( $iptables =~ /^iptables\b/ ) { 
   ...
}

=~绑定运算符,它告诉所提供的正则表达式,其源是该变量。正则表达式简单地说是查看序列“iptables”的字符串的开头,然后是“word-break”。因为' - '是一个“非单词”字符(不是字母数字或'_'),所以它会破坏这个单词。您也可以使用' - ':

/^iptables-/

但你可以用这句话完成整个事情:

use strict;
use warnings;
use List::MoreUtils qw<any>;

...
if ( any { m/^iptables-/ } `rpm -q iptables` ) {
    ...
}

通过反引号直接将输出汇总到列表中,并通过any搜索该列表(参见List::MoreUtils::any

答案 2 :(得分:0)

为什么不看一下“rpm -q”的返回值,无论是否分别安装,它都将返回0或1?