2015-04-02 4 views
0

Аргумент -n заставляет Perl размещать цикл вокруг программы, что заставляет его перебирать аргументы типа файла несколько как sed -n или awk.Пропустить строки, когда «perl -n»

Теперь, возможно ли пропустить захват некоторых из следующих строк линии в сценарии, используя -n?

#!/usr/bin/perl -wn 

if (/my case/) { 
    # Skip two lines 
    <>; <>; 
    # Do something with the line just read. 
} 

Вышеуказанное не работает для меня. $_ застревает в той же строке/содержании.

ответ

2

Это работает для меня:

perl -wE 'say for 1..10' | perl -ne 'if (/2/) { <>; <>; print "!$_" } else { print }' 
1 
!2 
5 
6 
7 
8 
9 
10 

Если вы хотите обработать следующие две строки, хранить их в переменных.

$line1 = <>; $line2 = <>; 

<> сама по себе не заполняет $_ - только в частном случае while (<>).

+0

* «<сам по себе не заполняет $ _ - только в специальном случае while (<>)." *, Ahh, вот что меня достало. Благодаря!!! – xpt

1

Другой подход заключается в использовании скользящего окна буфера.

perl -ne' 
    push @buf, $_; 
    next if @buf <= 3; 
    shift(@buf); 

    if ($buf[0] =~ /c/) { 
     my $line1 = $buf[1]; 
     my $line2 = $buf[2]; 
     ... 
    } 
' 
Смежные вопросы