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