gpt4 book ai didi

perl 分配对子程序的引用

转载 作者:行者123 更新时间:2023-12-01 05:15:54 28 4
gpt4 key购买 nike

我在子例程中使用@_ 来获取分配为数组引用的参数,但结果未显示为数组引用。

我的代码在下面。

my @aar = (9,8,7,6,5);

my $ref = \@aar;

AAR($ref);

sub AAR {
my $ref = @_;
print "ref = $ref";
}

这将打印 1 ,而不是数组引用,但如果我将 @_ 替换为 shift ,打印结果将是一个引用。

谁能解释为什么我无法使用@_ 获得引用?

最佳答案

这是关于 Perl 中的 context 的。这是语言的一个重要方面。

类似的表达式

my $var = @ary;

尝试将数组分配给标量。

这没有任何意义,发生的情况是右侧被评估为数组元素的数量,并且 被分配给 $var

为了改变这种行为,您需要向赋值运算符提供“列表上下文”。在这种情况下,您应该这样做

my ($var) = @ary;

现在我们将一个列表(数组元素)分配给一个列表(变量,这里只有$var),它们被一对一地分配。所以这里 @ary 的第一个元素被分配给 $var。请注意,这句话与“列表”这个难以捉摸的概念很不协调。

所以在你的情况下你想要

my ($ref) = @_;

并且根据需要将 @_ 中的第一个元素分配给 $ref

或者,您可以使用 shift 删除并返回 @_ 的第一个元素,在这种情况下,标量上下文分配很好

my $ref = shift @_;

这种情况下你也可以这样做

my $ref = shift;

因为 shift 默认适用于 @_

当您想要删除输入的第一个元素时,这很有用,因为它被分配以便剩余的 @_ 非常适合进一步处理。它通常在面向对象的代码中完成。


值得指出的是,Perl 中的许多运算符和内置工具的行为不同,具体取决于调用它们的上下文。

对于一些细节,仅举几个例子:正则表达式匹配运算符在标量上下文中返回真/假(1/空字符串),但在列表上下文中实际匹配, readdir 返回单个条目在标量上下文中,但它们都在列表上下文中,而 localtime 显示出更明显的差异。这种上下文相关的行为存在于 Perl 的每个角落。

可以通过 wantarray 使用户级子程序以这种方式运行。


Scalar vs List Assignment Operator详细讨论

in perlretutin perlop 为例

关于perl 分配对子程序的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53112055/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com