【问题标题】:Perl: Not enough arguments for functionPerl:函数的参数不足
【发布时间】:2013-02-23 17:29:37
【问题描述】:

我是 Perl 的新手,目前正在尝试理解提到的错误消息。

我有这段代码(仍然主要用于测试pourposes)

#!/usr/bin/perl

use strict;
use warnings;

my %info = (autor => "Karryanna", jazyk => "cs");

vec([%info]);

sub vec
{
  my ($hashref) = @_;
  print $hashref->autor . "\n";
}

当我尝试运行它时,它会给出这个错误消息

Not enough arguments for vec at test.pl line 8, near "])"

当我尝试用谷歌搜索它时,我找到了this site,这让我觉得在子例程调用之前加上一个&符号就足够了。我试过了,确实有帮助。

但是,当我后来遇到另一个问题时,谷歌搜索将我带到了this SO question。关键是答案指出

你应该调用不带 & 的子程序,例如populate(...),除非你特别想覆盖 sub 的原型。如果您不知道原型是什么,请不要使用 &。

我完全不知道 Perl 上下文中的原型是什么。 那么 - 现实是什么样的?我应该只使用 & 还是有其他可能更“干净”的解决方案?

谢谢!

(顺便问一下,如果我可能会问一点OT问题——我真的应该在调用后定义子程序吗?这对我来说似乎很不自然,但是,我已经发现恢复顺序会使编译器抱怨)

【问题讨论】:

  • vec 是一个内置函数。
  • 除了 aschepler 刚才所说的 vec() 是一个内置函数(与您的子名称冲突)之外,您可能应该像这样传递您的哈希引用:vec(\%info),否则您将拥有更复杂的哈希结构的问题。
  • 我可能同意在这种情况下调用 vec(\%info) 会更好。但是,我想编辑子程序内部的内容而不影响子程序外部的变量,我必须像现在这样调用它,对吗?
  • @Karryanna 您仍然可以在不更改原始内容的情况下复制部分哈希。例如。 my $foo = $href->{'foo'}; $foo =~ s/foo/bar/g; 请确保不要复制引用,因为它们会指向相同的内存位置。`
  • @TLP 好的,我现在可能看到了。谢谢!

标签: perl


【解决方案1】:

vec 是一个 perl 内置函数,您会遇到名称冲突 (perldoc -f vec)。调用你的子程序别的东西。

你可能想这样称呼它:

mysub(\%info)

在 Perl 中,您可以在声明子程序之前或之后调用它。唯一的限制是使用原型时,您可能不想这样做。颠倒顺序时会出现什么错误(“使编译器抱怨”并没有多大帮助)?这可能是因为名称冲突。

【讨论】:

  • 如果它真的必须是名称vec,可以use subs qw/vec/ 覆盖当前包的内置函数..
  • 啊,这是一个愚蠢的错误。错误是......“模棱两可的调用解析为 CORE::vec(),符合条件或使用 &”。它现在很有意义。好吧,希望通过几天和多年的经验,这会变得更好。无论如何,谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2014-05-05
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多