Как я могу эмулировать функциональность grep -B в Perl? - PullRequest
3 голосов
/ 25 ноября 2011

Я искал решение, которое позволило бы мне искать строки массива, и, если найдено совпадение строк, вставьте эту строку и две предыдущие строки в массив.Кажется, это легко сделать с помощью команды grep.Однако я не могу заставить это работать.Вот что у меня есть:

sub ipsearch {
    my $ip = $_[0];
    my @IPVSCONFIG =  grep (/\W+virtual\s$ip\s/, @RAWDATA);
}

Можно ли добавить синтаксис "-B 2" к команде grep?Я пробовал несколько форм этого синтаксиса, но не могу заставить его работать:

@IPVSCONFIG =  grep -B 2 (/\W+virtual\s$ip\s/, @RAWDATA);

Пожалуйста, дайте мне знать, если это вообще возможно, и какой должен быть правильный синтаксис.Если у вас есть другие предложения, пожалуйста, дайте мне знать.

Спасибо за помощь!

Ответы [ 3 ]

5 голосов
/ 25 ноября 2011

Хитрость заключается в том, чтобы определить линии, где происходит совпадение, а затем определить соответствующие индексы:

Получить сопоставленные индексы:

my @matchedIndices = grep { $RAWDATA[$_] =~ /\W+virtual\s$ip\s/ } 2 .. $#RAWDATA;

Получить индексы вокруг:

my @wantedIndices  = map { ( $_-2 .. $_ ) } @matchedIndices;

И возьмите фрагмент массива:

my @IPVSCONFIG = @RAWDATA[ @wantedIndices ];

Совокупность его в преобразовании Шварца:

my @IPVCONFIG = map  { @RAWDATA[$_-2..$_] }
                grep { $RAWDATA[$_] =~ /\W+virtual\s$ip\s/ }
                2 .. $#RAWDATA ;

Определенно гораздо более загруженное решение, чем традиционная командная строка grep -B 2!

3 голосов
/ 25 ноября 2011

Базовая версия вашей подпрограммы. Я предполагаю, что вы хотели вернуть список, когда закончите с ним. Непроверенные.

sub ipsearch {
    my $ip = shift;
    my @IPVSCONFIG = (); # no matches should be empty list, not undef
    my @buffer = ()      # to avoid undef warnings
    for (@RAWDATA) {
        push @buffer, $_;
        shift @buffer if @buffer > 3;
        if (/\W+virtual\s$ip\s/) {
            push @IPVSCONFIG, @buffer;
            @buffer = ();
        }
    }
    return @IPVSCONFIG;
}
2 голосов
/ 25 ноября 2011

Вы смешиваете программу grep /bin/grep с функцией perl с именем grep (perldoc -f grep).В то время как первый принимает дополнительные параметры, такие как -B, второй - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...