2014-09-23 40 views
0

我在其他語言中看到了相當於PHP's compact function的問題,但不包含Perl,所以請原諒我,如果這是我錯過的東西的重複。如果你不熟悉這個功能,這是我正在尋找的。Perl的等價PHP的compact()?

鑑於變量:

my $one = "1"; 
my $two = "2"; 
my $three = "3"; 

#using compact as example here since this function doesn't exist in perl 
my $array = compact("one","two","three"); 

然後傾倒$陣列將給予:

[ 
    one => "1, 
    two => "2", 
    three => "3" 
] 

PHP documentation for compact

創建一個包含變量及其值的數組。

對於其中的每一個,compact()都會在當前符號表中查找具有該名稱的變量,並將其添加到輸出數組中,以便變量名稱變爲關鍵字,並且該變量的內容將成爲該關鍵字的值。

我特別使用5.8.8版本。原諒我,如果我的一些語法關閉。我的背景是PHP。

+3

什麼是你要完成的,需要緊湊的()? – 2014-09-23 20:11:37

+2

我可能會誤解,但看起來很像[將變量用作變量名稱](http://perl.plover.com/varvarname.html)。呸。 – ThisSuitIsBlackNot 2014-09-23 20:12:03

+2

幸運的是,在perl中沒有這個相同的東西,這對於一種語言來說似乎是一件可怕的事情。如果你解釋你想做什麼而不是你想做什麼,這裏的某個人可能會幫助你獲得更好的解決方案(可能涉及哈希)。 – AKHolland 2014-09-23 20:19:14

回答

1

相反的:

my $one = "1"; 
my $two = "2"; 
my $three = "3"; 

#using compact as example here since this function doesn't exist in perl 
my $array = compact("one","two","three"); 

可能你想:

use strict; 
use warnings; 
use feature 'say'; 
use Data::Dumper; 

my $numbers = { 
    one => 1, 
    two => 2, 
    three => 3, 
}; 

say Dumper $numbers; 
my $sum = $numbers->{one} + $numbers->{two}; 
say $sum; 
0

如果變量聲明爲包變量(如$::one = 1our $one = 1),那麼它可能做到這一點通過檢查符號表。不過,我強烈建議不要這樣做。我一直在編程Perl超過20年,我從來沒有這樣做過。代之以使用散列。

請不要這樣做。但是如果你陷入困境並且真的很難找到解決方案,那麼就是一個解決方案。它只適用於聲明爲包變量的簡單標量值(如您的示例中)。

my %hash = map { $_ => ${$::{$_}} } qw{one two three}; 

或者:

sub compact { +{ map { $_ => ${$::{$_}} } @_ } } 

my $hashref = compact("one", "two", "three");