我正在尝试逐行打印以下内容:
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
.
.
.
答案 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
.
.
.