很抱歉问了很多次关于阅读线和其他东西的问题。我碰巧正在处理一个像这样的巨大(500,000 行)文件:
2013-05-27T19:01:23 [INFO] item_id:1, start at Reader.pm line 23
2013-05-27T19:01:29 [INFO] item_id:2, pause at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:1, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:1, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:1, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:1, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:3, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:3, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:3, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
2013-05-27T19:01:30 [INFO] item_id:5, start at Reader.pm line 23
我需要做的是,将文件位置作为输入,制作一个脚本,其输出应类似于以下内容:
$output = [ {item_id => 1, counter => 2 }, { item_id......
也就是说,每个 item_id 都应该与它在数组 ref 中的开始数配对。请注意,我不能使用“while”多次读取文件,因为它太大了。另外,我不知道先验有多少项目。
我使用 Stackoverflow 成员的提示编写的方法如下:
sub count_start{
open LOGFILE, $file_location;
my $max;
my $i;
my $counter = 0;
my $found = 0;
my $data;
while (<LOGFILE>) {
next unless /item_id:(\d+)/;
$found = $1 if $found < $1;
for ($i =1, $i<=$found, $i++){
if ($file_location =~ /\bitem_id:$i, start\b/ig){
$counter++;
}
$output = [ $i => $counter ];
}
}
close LOGFILE;
return $output;
}
1;
但是一切都出了问题:(。我收到了很多讨厌的警告,但没有任何与我被要求的类似的东西。有什么想法或建议吗?
原谅这个 perl 新手的糟糕代码。