【发布时间】:2013-05-29 05:26:23
【问题描述】:
我真的需要 Perl 黑客的帮助。这看起来很简单,但我已经考虑了一个小时并没有提出任何解决方案。
假设我们有一个平面文件或日志文件,如下所示:
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
(...)
我必须创建一个方法来找到最大的 item_id 编号,在本例中为 5,并将其定位在变量 $found 中。请注意,我们不知道先验是最大的数字,所以我不能使用 grep,因为我需要将“最大的数字(在这种情况下为 5)”作为输入。我们唯一的输入是文件的位置。你有什么建议?
【问题讨论】:
-
有关信息,perl one 衬里和循环最快,大约 600 毫秒。循环程序为 700-800 毫秒。
max @ids大约是 900 毫秒。cut | sed | sort是 1200 毫秒。sed | sort是迄今为止最慢的 3800 毫秒。 -
@Schwern 感谢您提供信息。顺便问一下,你会如何测试这样的任务?
-
use File::Temp; use Test::More; my $tmp = File::Temp->new; print $tmp $test_log_data; is max_item_id_in_log($tmp->filename), $expected_max_item_id; done_testing;