【问题标题】:Perl: Correct way to use Sub-routine Prototypes [%@$]Perl:使用子例程原型的正确方法 [%@$]
【发布时间】:2012-09-17 04:31:17
【问题描述】:
sub Function(\[$@%]);

适用于 Windows(Windows 7 上的 Perl v5.14.2),并接受所有 3 种参数。哈希、标量和列表。

但是,Linux 上的相同原型(CentOS 版本 4.5 上的 Perl 5.6.1)给了我

Malformed prototype for main::Function: \[%@$].

在这两个方面,我都在做use 5.006 否则,脚本完全相同。

【问题讨论】:

    标签: perl parameter-passing


    【解决方案1】:

    该原型在 5.6.1 中并不存在。这是最近添加的,因为它是在 5.14 中添加的。 (这意味着它在所有受支持的 Perl 版本中。)

    您不能将数组或哈希传递给 sub,只能传递标量列表。原型导致调用代码获取引用并传递它。您可以通过更改明确地做到这一点

    sub Function(\[$@%]) { }
    Function($s);
    Function(@a);
    Function(%h);
    

    sub Function { }
    Function(\$s)
    Function(\@a)
    Function(\%h)
    

    原型通常还是要避免的。

    【讨论】:

    • 当我执行use 5.006 时,我不是也强制Windows 中的Perl 5.6 行为吗?
    • @DarkXphenomenon,不,您指定您需要 v5.6 或更高版本。它会关闭您之前打开但在 5.6 中不存在的功能(如use features)。
    • 啊...我误解了use。有没有办法在 Perl 5.6.1 中做到这一点
    • 我需要强制它给我一个内部引用,当没有通过引用时,这就是我使用sub Function(\[$@%])的原因。根本没有办法继续Function($s);, Function(%h);
    • 是的,使用\[$@%] 原型。您不能将数组或哈希传递给子。只有一个标量列表,所以你需要在调用 sub 之前让 Perl 将 arg 转换为引用,这就是原型所做的。
    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2023-03-26
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多