如何使用Perl的File :: Grep模块

时间:2014-12-31 17:08:32

标签: perl

我正在使用File::Grep模块。我有以下例子:

#!/usr/bin/perl
use strict;
use warnings;

use File::Grep qw( fgrep fmap fdo );

my @matches = fgrep { 1.1.1 } glob "file.csv";

foreach my $str (@matches) {
    print "$str\n";
}

但是当我尝试打印$str值时,它会给我HEX值:GLOB(0xac2e78)

这段代码出了什么问题?

2 个答案:

答案 0 :(得分:2)

文档似乎不准确,但从源代码 - http://cpansearch.perl.org/src/MNEYLON/File-Grep-0.02/Grep.pm判断 - 从fgrep返回的列表包含每个文件一个元素。每个元素都是

形式的哈希
{
    filename => $filename,
    count => $num_matches_in_that_file,
    matches => {
        $line_number => $line,
        ...
    }
}

我认为跳过fgrep及其复杂的返回值会更简单,它会提供比您想要的信息更多的信息,而有利于fdo,这样您就可以遍历所有的行文件并做你想做的事:

 fdo { my ( $file, $pos, $line ) = @_;
       print $line if $line =~ m/1\.1\.1/;
 } 'file.csv';

(请注意,我删除了glob。编写glob "file.csv"时没有多大意义,因为只有一个文件可以匹配该全球字符串。)

或者甚至放弃这个模块并写下:

{
     open my $fh, '<', 'file.csv';
     while (<$fh>) {
         print if m/1\.1\.1/;
     }
}

答案 1 :(得分:1)

我假设您要查看file.csv中包含1.1.1的所有行?

File::Grep的文档不是最新的,但此程序会将@lines所有文件中的所有匹配行(如果有多个文件)放入。{/ p>

use strict;
use warnings;

use File::Grep qw/ fgrep /;
$File::Grep::SILENT = 0;

my @matches = fgrep { /1\.1\.1/ } 'file.csv';

my @lines = map {
  my $matches = $_->{matches};
  @{$matches}{ sort { $a <=> $b } keys %$matches};
} @matches;

print for @lines;

<强>更新

最简单的Perlish方式就是这样

use strict;
use warnings;

open my $fh, '<', 'file.csv' or die $!;

while (<$fh>) {
  print if /1\.1\.1/;
}