Perl - 将数组传递给子例程

时间:2013-12-13 15:39:17

标签: perl subroutine shift

我正在学习Perl并尝试编写一个脚本,该脚本将模式和文件列表作为命令行参数并将它们传递给子例程,然后子例程打开每个文件并打印行与模式匹配。以下代码有效;但是,它在从第一个文件打印行后停止,并且甚至不触摸第二个文件。我在这里缺少什么?

#!/usr/bin/perl
use strict;
use warnings;

 sub grep_file 
 {
  my $pattern = shift;
  my @files = shift;

  foreach my $doc (@files) 
  {
    open FILE, $doc;
    while (my $line = <FILE>) 
    {
      if ($line =~ m/$pattern/) 
      {
        print $line;
      }
    }
  }

grep_file @ARGV;

2 个答案:

答案 0 :(得分:8)

Shift会弹出参数中的元素(请参阅:http://perldoc.perl.org/functions/shift.html)。

所以@files只能包含一个值。

尝试

sub foo
{
 my $one = shift @_;
 my @files = @_;
 print $one."\n";
 print @files;
}

foo(@ARGV);

答案 1 :(得分:2)

没有理由在这里使用子程序。你只是将整个程序放在一个函数中,然后调用它。

<>运算符将按顺序读取@ARGV中的所有文件,而无需您明确打开它们。

我会像你这样编写你的程序

use strict;
use warnings;

my $pattern = shift;
$pattern = qr/$pattern/; # Compile the regex

while (<>) {
  print if $_ =~ $pattern;
}