微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Perl:特殊数组@_不是真的别名吗?

传递给函数的所有参数都存在的特殊数组@_实际上是传递参数的别名.因此,我们直接对这个特殊数组@_进行的任何改变也将在主要内容中反映出来.这很清楚
#!/usr/bin/perl

use warnings;
use strict;

$\="\n";

sub func {
        print \@_;
        $_++ for(@_);
}

my @arr=(2..4);
print \@arr;
func(@arr);
print "@arr";

对于上述程序,我预计@arr和@_的引用指向相同的位置,因为它是一个别名.但是不是这样.

运行以上:

ARRAY(0x1b644d0)
ARRAY(0x1b644e0)
3 4 5

如果他们指向2个不同的位置,@_中的更改如何在@arr中反映?

我看到有什么不对吗请指教.

解决方法

这可能会回答你的问题:
use warnings;
use strict;

$\="\n";

sub func {
        print \@_;
        $_++ for(@_);
        print \$_ for @_; 
}

my @arr=(2..4);
print \@arr;
func(@arr);
print "@arr";
print \$_ for @arr;

产量

ARRAY(0x17fcba0)
ARRAY(0x1824288)
SCALAR(0x17fcc48)
SCALAR(0x18196f8)
SCALAR(0x1819710)
3 4 5
SCALAR(0x17fcc48)
SCALAR(0x18196f8)
SCALAR(0x1819710)

如你所见,单个参数具有相同的地址,但容器不一样.如果您在func中将某项推送到@_,则@arr不会更改(因此您可以在功能上进行移动).因此,每个参数都是别名,数组元素作为单个项目传递. @_包含传入子程序的所有项目.如果要修改数组参数,则需要通过引用传递它.

原文地址:https://www.jb51.cc/Perl/172581.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐