Perl 将数组中的值取消引用到一行中声明的变量
要从函数调用中检索参数,我通常会这样做Perl 将数组中的值取消引用到一行中声明的变量,perl,reference,dereference,Perl,Reference,Dereference,要从函数调用中检索参数,我通常会这样做 use strict; use warnings; foo([1,2],[3,4]); sub foo{ my ($x, $y) = @_; ... } 在本例中,$x和$y现在分别是对数组的引用。如果我想轻松地使用这些数组中的变量,我首先要取消引用它们 ... my ($x1, $x2) = @{$x}[0,1]; # ...same for $y 我想知道是否有一种方法可以取消对@(或者实际上是任何其他数组)中的参数的引用并将它
use strict;
use warnings;
foo([1,2],[3,4]);
sub foo{
my ($x, $y) = @_;
...
}
在本例中,$x和$y现在分别是对数组的引用。如果我想轻松地使用这些数组中的变量,我首先要取消引用它们
...
my ($x1, $x2) = @{$x}[0,1];
# ...same for $y
我想知道是否有一种方法可以取消对@(或者实际上是任何其他数组)中的参数的引用并将它们返回到一行中声明的变量列表中?我没有完全得到您想要的,但是这样可以吗:
foo([1,2],[3,4]);
sub foo{
my ($x1,$x2) = @{$_[0]}[0,1];
say "x1=$x1 , x2=$x2";
}
输出:
x1=1 , x2=2
map
采用@
并使用@$
操作将其每个元素解引用到一个数组中
也可以使用的
deref
或d
函数来实现相同的目标。这就是为什么我要展开
:
sub unroll (@) {
return map { ref() eq 'ARRAY' ? @$_ : ref() eq 'HASH' ? %$_ : $_ } @_;
}
所以我可以这样说:
my ($x1, $y1, $x2, $y2) = unroll @_;
(或)
比以前漂亮多了
map { @$_ } @_[0, 1]
诸如此类。另外,它更健壮一些 这不是OP要问的。他想在一行中提取
($x1,$x2,$y1,$y2)
,我想我可以通过使用my($x1,$x2,$y1,$y2)=({$[0]}[0,1],{$[1]}[0,1])来提取它们代码>。因此,我可能只是想知道是否有一种快速的方法来展平数组:“@{[…]}
,在某些地方使用@[0,1]
和在其他地方使用@
有什么关系。错误的二分法!至于稳健性,map@$\,@
适用于所有数组,而unroll
不适用。此外,map@$\u,@
比unroll
检测到更多的错误输入。
my ($x1, $y1, $x2, $y2) = &unroll;
map { @$_ } @_[0, 1]