当前位置:  开发笔记 > 编程语言 > 正文

如果我手动设置Perl的@ARGV所以我可以使用<>打开,扫描,并关闭文件?

如何解决《如果我手动设置Perl的@ARGV所以我可以使用<>打开,扫描,并关闭文件?》经验,为你挑选了1个好方法。

我最近开始学习Perl,我最近的任务之一就是搜索一堆特定字符串的文件.用户提供目录名作为参数,程序将搜索该目录中的所有文件以查找该模式.使用readdir()我已经设法构建了一个包含所有可搜索文件名的数组,现在需要搜索模式的每个文件,我的实现看起来像这样 -

sub searchDir($) {
    my $dirN = shift;
    my @dirList = glob("$dirN/*");
    for(@dirList) {
        push @fileList, $_ if -f $_;

    }
    @ARGV = @fileList;
    while(<>) {
        ## Search for pattern
    }
}

我的问题是 - 如上所述,手动加载@ARGV数组并使用<>运算符扫描各行,还是应该单独打开/扫描/关闭每个文件?如果这个处理存在于子程序而不是主函数中会有什么不同吗?



1> James Thomps..:

关于操纵@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- 曾经尝试写在互联网上讽刺性的评论.


"谁甚至有4GB硬盘?" - 你几十年了?我的硬盘是150GB.也许你的意思是4GB的内存,这更加可信.但我的电脑有2GB的内存.那到底你在说什么?
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有