Чтение из файла и сравнение содержимого с переменной - PullRequest
2 голосов
/ 22 августа 2011
#!/usr/bin/perl
some code........
..................
system ("rpm -q iptables > /tmp/checkIptables");
my $iptables = open FH, "/tmp/checkIptables";

Приведенный выше код проверяет, установлен ли iptables на вашем компьютере с Linux?Если он установлен, команда rpm -q iptables выдаст вывод, как показано ниже:

iptables-1.4.7-3.el6.x86_64  

Теперь я перенаправил этот вывод в файл с именем checkIptables.

Теперь я хочу проверить, совпадает ли переменная $iptables с приведенным выше выводом или нет.Меня не волнуют номера версий.

Это должно быть что-то вроде

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

Но iptables * выдает ошибку.

Ответы [ 3 ]

3 голосов
/ 22 августа 2011

Вы можете использовать регулярное выражение для проверки строки:

$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 голос
/ 22 августа 2011

Я думаю, что вы ищете регулярное выражение или "образец соответствия". Вы хотите, чтобы строка соответствовала шаблону, а не конкретной вещи.

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

=~ является оператором binding и сообщает предоставленному регулярному выражению, что его источником является эта переменная. Регулярное выражение просто говорит: посмотрите в начале строки последовательность «iptables», за которой следует «перерыв слова». Так как «-» - это символ, не являющийся словом (не алфавитно-цифровой или «_»), он разбивает слово. Вы также можете использовать '-':

/^iptables-/

Но вы, вероятно, можете сделать все это с помощью этого утверждения:

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

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

отправка вывода напрямую в список с помощью обратных кавычек и поиск по этому списку с помощью any (см. List::MoreUtils::any

0 голосов
/ 24 августа 2011

Почему бы просто не посмотреть возвращаемое значение "rpm -q", которое будет возвращать 0 или 1 независимо от того, установлено оно или нет соответственно?

...