如何从文件中读取并在Perl中执行grep?

时间:2010-08-26 16:13:02

标签: perl

open(MR, "<path_to_report");
$rid;

文件可能非常大。它内部有一个独特的行,格式如下

Root identifier: <some number>

例如

Root identifier: 12987

我需要将12987提取到$rid

我怎样才能在Perl中做到这一点?

6 个答案:

答案 0 :(得分:4)

这是另一种使用更现代的习语的方法:

use warnings;
use strict;

open my $file, '<', 'path_to_report'   # 3 arg open is safer
     or die "could not open file: $!"; # checking for errors is good

my $rid;
while (<$file>) {
    last if defined( ($rid) = /Root identifier: (\d+)/ );
}

close $file;

if (defined $rid) {
    # do something with $rid
}

答案 1 :(得分:1)

while(<MR>) {
    chomp;
    ($rid) = $_ =~ m/Root identifier: (\d+)/;
    last if defined $rid;
}

答案 2 :(得分:0)

使用<>运算符一次读取一行,并使用Perl正则表达式查找并提取所需内容。如果您处于类似unix的环境中,请检查man perlre以获取Perl正则表达式参考。

答案 3 :(得分:0)

    #!/usr/bin/perl
    use strict;
    use warning;
    open(IN, '<', file) or die $!;
    read(IN, my $data, -s file);
    $rid =~ $data = m/Root identifier: (\d+)/;
    print"$rid";
    close(IN);

答案 4 :(得分:0)

以下内容会找到该号码,并将其保留在$rid

open(MR, "<path_to_report");
while(<MR>) {
   chomp;
   next unless /Root identifier:\s*[0-9]+\s*$/;
   tr/\D//g;
   $rid = $_;
}

您没有在“:”和数字之间或数字之后指定空格的确切数量或类型,因此我在数字前后包括\s*以允许可变数量。< / p>

答案 5 :(得分:-2)

我会用这样的东西:

#!/usr/bin/perl

use 5.010;

open(MR, "<", file) or die "cannot open file";
while(<MR>) {
    last if(/^Root identifier: (\d+)$/ig);
}

say($1);

P.S。:你也可以使用:

last if(/^Root identifier: (\d+)$/ig) while(<MR>);