首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有更好的方法来编写这些代码以避免冗余?

是否有更好的方法来编写这些代码以避免冗余?
EN

Stack Overflow用户
提问于 2014-06-17 09:12:28
回答 3查看 59关注 0票数 0

我在一个程序中有一个代码段,它接受来自管道的GNU样式输入(这是一个文件名列表)。如果STDIN不包含数据,则需要接受来自包含文件名的预定文本文件的输入。

我发现自己需要写多余的代码。是否有可能简化这段代码以避免冗余?

代码语言:javascript
复制
sub downloadlinkgen {
    my $fh;
    print "Printing links\n";
    if ($getfilelist==1) {
        open $fh, '<', "fuzzyfile" or die $!;
        while (<$fh>) {
            chomp ($_);     
            (my $fname,my $path, my $suffix) = fileparse($_);
            my ($name, $ext) = $fname =~ /(.*)\.(.*)/;      
            my $newfile=$path.$name.".$ext";
            $newfile =~ s/\s/%20/g; 
            $newfile =~ s/\/root/http:\/\/myip/;        
            print $newfile."\n";        
        }
    } else {        
        while (<>) {
            chomp ($_);     
            (my $fname,my $path, my $suffix) = fileparse($_);
            my ($name, $ext) = $fname =~ /(.*)\.(.*)/;      
            my $newfile=$path.$name.".$ext";
            $newfile =~ s/\s/%20/g; 
            $newfile =~ s/\/root/http:\/\/myip/;        
            print $newfile."\n";        
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-17 09:21:21

是的,只需使默认的ARGV文件句柄打开文件:

代码语言:javascript
复制
sub downloadlinkgen {
    @ARGV = 'fuzzyfile' if $getfilelist == 1;
    print "Printing links\n";
    while (<>) {
        chomp ($_);     
        (my $fname,my $path, my $suffix) = fileparse($_);
        my ($name, $ext) = $fname =~ /(.*)\.(.*)/;      
        my $newfile=$path.$name.".$ext";
        $newfile =~ s/\s/%20/g; 
        $newfile =~ s/\/root/http:\/\/myip/;        
        print $newfile."\n";        
    }
}
票数 4
EN

Stack Overflow用户

发布于 2014-06-17 09:19:34

代码语言:javascript
复制
sub downloadlinkgen {

  # default file handle  
  my $fh = \*ARGV;
  print "Printing links\n";
  if ($getfilelist==1) {
    open $fh, '<', "fuzzyfile" or die $!;
  }

  while (<$fh>) {
    chomp ($_);   
    (my $fname,my $path, my $suffix) = fileparse($_);
    my ($name, $ext) = $fname =~ /(.*)\.(.*)/;    
    my $newfile=$path.$name.".$ext";
    $newfile =~ s/\s/%20/g; 
    $newfile =~ s/\/root/http:\/\/myip/;    
    print $newfile."\n";    
  }
}

来自perldoc -f readline

从其类型from包含在EXPR中的文件句柄读取(如果未提供EXPR,则从*ARGV读取)

因此,\*ARGV是对从<>读取时使用的文件句柄的引用,在这两种情况下您都可以使用$fh

票数 2
EN

Stack Overflow用户

发布于 2014-06-17 11:04:03

即使你不知道ARGV,你也可以做这样简单的事情:

代码语言:javascript
复制
sub downloadlinkgen {
    my $fh;
    print "Printing links\n";
    if ($getfilelist==1) {
        open $fh, '<', "fuzzyfile" or die $!;
        while (<$fh>) {
            process_line($_);     
        }
    } else {        
        while (<>) {
            process_line($_);       
        }
    }
}

sub process_line {
    my $line = shift;

    chomp ($line);     
    (my $fname,my $path, my $suffix) = fileparse($line);
    my ($name, $ext) = $fname =~ /(.*)\.(.*)/;      
    my $newfile=$path.$name.".$ext";
    $newfile =~ s/\s/%20/g; 
    $newfile =~ s/\/root/http:\/\/myip/;        
    print $newfile."\n";  
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24259847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档