当将数组传递给Perl子例程时出现“参数过多”的错误?

27

我有一个Perl函数如下:

sub create_hash()
{
my @files = @_;

        foreach(@files){
         if(/.text/)
         {

         open($files_list{$_},">>$_") || die("This file will not open!");

         }
      }

}

我正在通过如下方式将数组参数传递给此函数:

create_hash( @files2);

这个数组里有大约38个值。
但是我却收到编译错误:

Too many arguments for main::create_hash at ....

我在这里做错了什么?

我的 Perl 版本是:

This is perl, v5.8.4 built for i86pc-solaris-64int
(with 36 registered patches, see perl -V for more detail)

11
()去掉?(比如 sub create_hash { .. } - user166390
如果您这样调用函数:create_hash(files2);(不带“@”符号),会发生什么? - Arfeen
如果我删除它们,错误就是:在 process.pl 的第 71 行找到了数组,期望的是运算符,在行末 (您需要预先声明 create_hash 吗?) process.pl 的第 71 行语法错误,接近“create_hash @files2” - Vijay
1
顺便说一句,5.8.4是Perl的一个非常古老的版本(虽然这与您的问题无关)。 您应该考虑安装更新的版本。 [perlbrew](http://search.cpan.org/perldoc?App%3A%3Aperlbrew)可以帮助解决这个问题。 - cjm
1
使用perlbrew,您不需要成为管理员就可以安装新版本的Perl供自己使用。您所需要的只是一个合适的C工具链和足够的磁盘空间。 - cjm
显示剩余2条评论
2个回答

82

你的问题就在这里:

sub create_hash()
{
() 是一个原型(prototype),在这种情况下,它表示 create_hash 不需要参数。如果您尝试传递参数,Perl 将会报错。
正确的写法应该是:
sub create_hash
{

通常情况下,你不应该在Perl函数中使用原型。它们与大多数其他语言中的原型不同。它们确实有用途,但这是Perl中相当高级的主题。


4
愿上帝保佑。这让我头疼了 :) - N3Xg3N

-3

可以使用数组引用:

sub create_hash {
    my ($files) = @_;
    foreach(@{$files)){
      ...
    }
}

create_hash(\@files2);

可以使用数组引用,但是在 sub create_hash() { rest_of_that_code } 中仍会生成错误。 - user166390
@pst:不是“sub create_hash() {”,而是“sub create_hash {”。 - cdtits
2
@cdtits,你的解决方案虽然可行,但你没有解释为什么Peter的代码一开始没有起作用。 - cjm
@cdtits 这就是我的观点——声明不同。转换为数组引用只是次要的 :) - user166390
@pst:那么为什么要评论您使用数组引用,却完全不提原型呢? - Borodin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接