Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl-将数组传递给子例程_Perl_Subroutine_Shift - Fatal编程技术网

Perl-将数组传递给子例程

Perl-将数组传递给子例程,perl,subroutine,shift,Perl,Subroutine,Shift,我正在学习Perl,正在尝试编写一个脚本,该脚本将模式和文件列表作为命令行参数,并将它们传递给子例程,然后子例程打开每个文件并打印与模式匹配的行。下面的代码有效;但是,它在打印第一个文件中的行后停止,甚至不接触第二个文件。我错过了什么 #!/usr/bin/perl use strict; use warnings; sub grep_file { my $pattern = shift; my @files = shift; foreach my $doc (@files

我正在学习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;
#/usr/bin/perl
严格使用;
使用警告;
子grep_文件
{
我的$pattern=shift;
我的@files=shift;
foreach my$doc(@files)
{
打开文件,$doc;
while(我的$line=)
{
如果($line=~m/$pattern/)
{
打印$行;
}
}
}
grep_文件@ARGV;

Shift从参数中弹出一个元素(请参见:)

所以@files只能包含一个值

试一试


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

空的
操作符将按顺序读取
@ARGV
中的所有文件,而无需显式打开它们

我会这样编写你的程序

use strict;
use warnings;

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

while (<>) {
  print if $_ =~ $pattern;
}
使用严格;
使用警告;
我的$pattern=shift;
$pattern=qr/$pattern/#编译正则表达式
而(){
如果$\=~$pattern,则打印;
}

当然!我对轮班有相似但不同的理解。非常感谢,它起了作用。博罗丁:你是对的,所以我删除了一些信息,如果这对他有帮助的话,他可能会接受这个答案(如他所示).关于他的分数统计,我只是想告诉他,如果这有帮助,就像他解释的那样,他可以接受这个答案,将问题设置为已解决。我认为,大约一天后,可以在问题下发表评论,解释如果问题已解决,应接受答案。我的意思是你的
foo
I它与OP的
grep_文件
非常不同,它在正则表达式后的一行上打印
file1file2file3file4file5file6
。我同意不需要子程序,但也许他只是构建了一个简单的示例来理解他的问题并解决它。也许。但你自己的答案解释了OP为什么会得到意想不到的结果(有一个奇怪的无关子程序!)我不明白为什么一个简单而极简的例子来演示shift的工作方式是奇怪的不相关的?在这种情况下,您的答案应该以同样的方式被丢弃。只留下一个对perl shift文档的引用而不加注释必须是唯一正确的答案。@Stefan这是关于您自己的答案,所以我在这里作出了回应。
use strict;
use warnings;

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

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