我最近开始学习Perl,我最近的任务之一就是搜索一堆特定字符串的文件.用户提供目录名作为参数,程序将搜索该目录中的所有文件以查找该模式.使用readdir()
我已经设法构建了一个包含所有可搜索文件名的数组,现在需要搜索模式的每个文件,我的实现看起来像这样 -
sub searchDir($) { my $dirN = shift; my @dirList = glob("$dirN/*"); for(@dirList) { push @fileList, $_ if -f $_; } @ARGV = @fileList; while(<>) { ## Search for pattern } }
我的问题是 - 如上所述,手动加载@ARGV数组并使用<>运算符扫描各行,还是应该单独打开/扫描/关闭每个文件?如果这个处理存在于子程序而不是主函数中会有什么不同吗?
关于操纵@ARGV的主题 - 那肯定是工作代码,Perl当然允许你这样做.我不认为这是一个很好的编码习惯.我见过的大部分代码都使用"while(<>)"成语来使用它来读取标准输入,这就是我最初期望你的代码所做的事情.更可读的模式可能是单独打开/关闭每个输入文件:
foreach my $file (@files) { open FILE, "<$file" or die "Error opening file $file ($!)"; my @lines =; close FILE or die $!; foreach my $line (@file) { if ( $line =~ /$pattern/ ) { # do something here! } } }
这对我来说更容易阅读,尽管它还有一些代码.Perl为您提供了很大的灵活性,但我认为这使得在Perl中开发自己的风格变得更加重要,这对您(以及您的同事,如果这对您的代码/职业很重要)是可读和可理解的.
将子程序放在主函数或子程序中也是一个风格决定,你应该玩和思考.现代计算机在这方面的速度如此之快,以至于样式和可读性对于这样的脚本来说更为重要,因为您不太可能遇到这样的脚本对您的硬件进行过度征税的情况.
祝好运!Perl很有趣.:)
编辑:当然,如果他有一个非常大的文件,他应该做一些比将整个文件变成数组更聪明的事情.在这种情况下,这样的事情肯定会更好:
while ( my $line =) { if ( $line =~ /$pattern/ ) { # do something here! } }
当我写下"你不太可能遇到这样一个脚本对你的硬件过度征税的情况"这一点的意思是要涵盖这一点,抱歉没有更具体.此外,谁拥有4GB硬盘,更不用说4GB 文件?:P
另一个编辑:根据评论者的建议仔细阅读互联网后,我意识到有超过4GB的硬盘可供购买.我感谢评论者指出了这一点,并在未来的承诺永不ever- 曾经尝试写在互联网上讽刺性的评论.