gpt4 book ai didi

perl - perl 中的隐式转换

转载 作者:行者123 更新时间:2023-12-04 19:14:44 24 4
gpt4 key购买 nike

我是 Perl 新手,谁能帮我解释一下以下脚本:

#!/usr/bin/env perl
use strict;
use warnings;
sub f1($) { my ($v) = @_; print "f1 $v\n"; }
sub f2(@) { my ($v) = @_; print "f2 $v\n"; }
my $s = "ww";
my @a = ("xx", "yy", "zz");
f1 $s; f1 @a; f2 $s; f2 @a;

我电脑的输出是:
f1 ww
f1 3
f2 ww
f2 xx # why!!

谁能解释为什么第四个输出是xx?我认为应该是zz,因为当数组转换为标量时,它应该是数组的最后一个元素。

最佳答案

不,使用如下声明:

my ($v, $foo, $bar) = @_;
$v将被赋予 @_ 中的第一个值数组, $foo第二个,以此类推。这是因为括号强加了一个列表上下文。任何多余的值都将被忽略,除非您的变量之一是一个数组,在这种情况下,它将吞噬所有剩余的值。
my ($v, @foo, $bar) = @_;   # wrong! $bar will never get any value
$v将得到第一个值, @foo其他的。 $bar将是未定义的。

您可能正在考虑使用列表进行分配:
my $v = qw(a b c);

但这是错误的,并且会导致错误:
Useless use of a constant (a) in void context at -e line 1.
Useless use of a constant (b) in void context at -e line 1.

这是因为 LHS 使用标量上下文,它将(或多或少)类似于:
'a';
'b';
my $v = 'c';

你可能会注意到,如果我们通过放置 $v 来强加列表上下文。在括号内,我们得到不同的结果:
my ($v) = qw(a b c);  # $v is now 'a'

ETA:关于原型(prototype):

f1 ,你看到的是数组被强制进入标量上下文,因为子例程需要一个标量参数。这就是为什么 f1使用数组打印 3 (尺寸)。当原型(prototype)查找一个数组时,该数组保留在默认列表上下文中,并且按正常方式完成分配(如上所述)。

作为一个额外的说明:原型(prototype)有一个非常具体的用途,使子例程在参数处理方面更像某些内置函数。如 sort { code here }push @array, $foo .

如果这不是您所追求的,您应该一起跳过原型(prototype)并简单地编写:
sub f1 {
...
}

文档 here

关于perl - perl 中的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11151062/

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