2011-04-14 103 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")