Perl逐行读取和打印

时间:2014-11-18 07:52:14

标签: perl

我正在尝试逐行打印以下内容:

My info


info | info | info |
-------------------------
1    |  1   | 
2
3
.
.
.

我正在使用它进行编码,但无法按照我的预期打印出来。

use strict;
use warnings;

my $file = 'myfile.txt';
open my $info, $file or die "Could not open $file: $!";

while( my $line = <$info>)  {   

    if ($line =~ /info | info | info | /) {
        print $line;    
        last if $. == 10;
    }
}
close $info;

代码中是否有遗漏或出错的地方?

预期结果应在CMD上打印

info | info | info |
-------------------------
1    |  1   | 
2
3
.
.
.

3 个答案:

答案 0 :(得分:4)

在Perl中执行此操作的惯用方法是使用the range operator,通常称为触发器:

perl -ne'print if /^info/ .. eof' yourfile.txt

在程序文件中,它将是:

use strict;
use warnings;

while (<>) {
    print if /^info/ .. eof;
}

答案 1 :(得分:3)

怎么样:

use strict;
use warnings;

my $file = 'myfile.txt';
open my $info, $file or die "Could not open $file: $!";
my $print = 0;
while( my $line = <$info>)  {   
    $print = 1 if $line =~ /^info/;
    print $line if $print;
    last if $. == 10;
}
close $info;

根据评论更新:

如果要匹配info: ** info,则必须转义元字符(此处为*字符):

$print = 1 if $line =~ /^info: \*\* info/;

,如果有可选空格:

$print = 1 if $line =~ /^\s*info:\s*\*\*\s*info/;

答案 2 :(得分:1)

请试一试。

while(<DATA>) { print $_, unless($_!~m/^$/ && $_!~m/My info/i && $. >= '10'); }

__DATA__
My info
info | info | info |
-------------------------
1    |  1   | 
2
3
.
.
.