加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl中的隐式转换

发布时间:2020-12-16 06:25:13 所属栏目:大数据 来源:网络整理
导读:我是Perl的新手,请有人为我解释以下脚本: #!/usr/bin/env perluse strict;use warnings;sub f1($) { my ($v) = @_; print "f1 $vn"; }sub f2(@) { my ($v) = @_; print "f2 $vn"; }my $s = "ww";my @a = ("xx","yy","zz");f1 $s; f1 @a; f2 $s; f2 @a; 我
我是Perl的新手,请有人为我解释以下脚本:

#!/usr/bin/env perl
use strict;
use warnings;
sub f1($) { my ($v) = @_; print "f1 $vn"; }
sub f2(@) { my ($v) = @_; print "f2 $vn"; }
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:关于原型:

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

另外要注意:原型具有非常特殊的用途,使子程序在参数处理方面的行为更像某些内置函数.例如sort {code here}或push @array,$foo.

如果这不是你想要的,你应该一起跳过原型,然后简单地写:

sub f1 {
...
}

文件here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读