我应该从自己的perl模块中读取ARGV
发布时间:2020-12-16 06:19:42 所属栏目:大数据 来源:网络整理
导读:我的Perl从(多个)日志文件中提取和处理数据,当前正在处理@ARGV中的所有文件. 这个脚本最重要的部分是日志解码本身,它结合了很多关于日志文件格式的知识.这个转换部分来自log(实际上是一个散列数组)已被证明是变化的主题(随着日志格式的发展),并成为进一步处
我的Perl从(多个)日志文件中提取和处理数据,当前正在处理@ARGV中的所有文件.
这个脚本最重要的部分是日志解码本身,它结合了很多关于日志文件格式的知识.这个转换部分来自log(实际上是一个散列数组)已被证明是变化的主题(随着日志格式的发展),并成为进一步处理步骤的基础:从解码记录中经常有特定的问题要回答在Perl中做得最好,这就是为什么我想把它变成一个模块. 核心功能是使用嵌套(或命名为作用域)模式匹配坐在while(<>)循环中: while (<ARGV>) { $totalLines ++; if (m/^(d{4}-dd-dd dd:dd:dd) L(d) (.+)/) { my $time = $1; my $line = $2; my $event = $3; if ($event =~ m/^connect: (.+)$/) { $pendings{$line}{station} = $1; ... …在关闭括号之前有超过200行. 我觉得简单地从ARGV阅读将超过Do one thing and do it well规则.当我搜索网络时,我发现在模块中没有任何明确说明或反对ARGV阅读的内容,但也许我的搜索模式很差. [1] [2] (如何)我应该重新构建解码器以将其放入模块中?…或者我应该改变对此的感受? [1] perltrap – perldoc.perl.org 解决方法
你可以让你的功能不知道< ARGV>迭代器逻辑,
sub foo { my ($iter) = @_; # `defined()` should be used explicitly unlike `while (<ARGV>)` while (defined (my $line = $iter->())) { # if .. } } foo(sub{ scalar <ARGV> }); # force scalar context; one line/record per call (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |