2011-04-14 73 views
2

如何在perl中返回局部变量数组(或任何变量)的值。例如。我必须返回对数组的引用吗?这似乎是行不通的。Perl编程和返回值

sub routine 
{ 
my @array = ("foo", "bar"); 
return @array; 
} 

但这似乎并不奏效。你如何从perl中的局部变量返回值?

我的第二个相关的问题是,我如何作为一个数组访问嵌套数组例如。上一个问题也创建了对此解决方案的需求。

@nestedArray = ("hello", "there"); 
@array = ("the", \@nestedArray); 

($variable1, $variable2) = values @array; 

这是我已经试过

($variable3, $variable4) values $$variable2; ## This doesn't seem to work? 

: -/

+6

您的第一个示例如何不起作用?你期望它做什么没有做到? – 2011-04-14 01:53:07

+0

我必须以不同的方式输入:-( – rubixibuc 2011-04-22 06:43:50

回答

3

你的第二个问题,你应该阅读perlreftut来清理你引用的理解。

另外,虽然keysvalues将在技术上对阵列起作用,但它们并不真正用于它们。这是一只红鲱鱼。

+0

将数组的每个值提取到标量列表中的正确方法是什么 – rubixibuc 2011-04-14 03:26:34

+3

正确将数组的每个值提取到标量列表中的方法是用一个简单的“列表赋值”,例如($ variable1,$ variable2)= @array; – tadmc 2011-04-14 03:32:28

+0

谢谢:-),我读了这个参考文件,好。 – rubixibuc 2011-04-14 03:42:38

0

对于第二个,这个工程:

($variable3, $variable4) = @$variable2; 

你的第一个例子似乎工作你拥有了它。

0

您通常会直接返回对非标量变量或标量值的引用。

return $var 
or 
return \@var 
or 
return \%var 

然后解除引用它们作为%$变种或@ $变种或使用箭头符号

$变种 - > [0]或$变种 - > {HASH_KEY}

+0

为什么不直接返回数组保存的列表 – tchrist 2011-04-14 02:47:07

+0

也许是因为转换为列表与返回数组不一样?不完全确定,但它在perl中是如此常见的习惯用法编程我已经习以为常了 – 2011-04-14 03:14:00

+0

在列表上下文中,它是相同的,在标量上下文中它是不同的 – tchrist 2011-04-14 04:23:44

2
sub routine { 
    my @array = ("foo", "bar"); 
    return @array; 
} 

print join "\n", routine(); 

上面确实返回一个列表。

@nested_array = ("hello", "there"); 
@array = ("the", \@nested_array); 

print join "\n", ($array[0], @{ $array[1] }); 

这里,@array第一元件是the和所述第二元件是一个数组引用。因此,你必须将第二个元素作为一个数组进行解引用。

但是,为了便于,你可以在第二阵列压扁成一个列表:

@array = ("the", @nested_array); 
print join "\n", @array; 
0

首先,你做对了。但我认为你在标量上下文中调用该函数,所以你只能得到列表/数组中的元素数。

sub routine 
{ 
    my @array = ("foo", "bar"); 
    return @array; 
} 

my $a = routine(); # a will be **2** instead of an array ("foo", "bar") 
my @a = routine(); # a will be an array ("foo", "bar") 

如果你真的需要返回一个数组,并且希望确保sub被正确调用。您可以使用wantarray()功能。

sub routine 
{ 
    my @array = ("foo", "bar"); 

    return @array if wantarray; 

    die "Wrong invoking context"; 
} 

第二,你可以使用推;

@nestedArray = ("hello", "there"); 
@narray = ("the", "world"); 

push @narray, @nestedArray; # @narray is ("the", "world", "hello", "there")