【发布时间】: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