我正在使用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)
这段代码出了什么问题?
答案 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/;
}