2013-02-02 32 views
1

我想在cppflags中自動將cflags中的所有項目自動加入。我如何?以下失敗代碼:在聲明中使用散列的Perl

my %conf = (
    'cflags' => ['-g', '-O0'], 
    'cppflags' => [ @{$conf{cflags}} ], 
    'bindir' => $PWD . "/bin", 
); 

對不起這個愚蠢的問題,我是新來的perl:P。

+0

將標誌從cflags複製粘貼到cppflags?或者之後添加一個賦值,比如'$ conf {cppflags} = $ conf {cflags}'。 – TLP

+0

@TLP copypasting很髒。第二種方式很好,但是否存在更好的方式,內聯? – user2036212

+0

這個變量的初始化。它不是動態的,那麼你如何完成這項任務又有什麼關係呢?在創建之前,您無法在'%conf'中使用這些密鑰,因此必須使用相同的數據或之後完成:無法「在線」完成。 – TLP

回答

3

你還在建立分配給%conf的列表,所以沒有分配到%conf,所以試圖從$conf{cflags}讀取將沒有結果。

選項1:

my @cflags = qw(-g -O0); 
my %conf = (
    cflags => [ @cflags ], 
    cppflags => [ @cflags ], 
    bindir => "$PWD/bin", 
); 

選項2:

my %conf; 
$conf{cflags } = [qw(-g -O0)]; 
$conf{cppflags} = [ @{ $conf{cflags} } ]; 
$conf{bindir } = "$PWD/bin"; 

選項3:

my %conf = (
    cflags => [qw(-g -O0)], 
    bindir => "$PWD/bin", 
); 
$conf{cppflags} = [ @{ $conf{cflags} } ]; 

(在減少個人喜好的順序)

+0

如果可以的話,我會讚賞你兩次。可悲的是,我甚至無法提拔你一次(不到15代表),所以有一個動機的評論,而不是:D。 – user2036212

+0

(實際上,'my $ conf'還沒有執行完畢!賦值運算符在它的LHS之前評估它的RHS,這允許像'my $ x = 3; {my $ x = $ x; ++ $ x;說$ x;#4}說$ x;#3'。) – ikegami

+0

重新選擇1:任何理由不要做'cflags => \ @cflags,cppflags => \ @cflags,...''? –

1

跟進在ikegami的回答中,這裏是有一個稍微不同的使用情況下,另外一個建議:

my @cflags = qw(-g -O0); 
my %conf = (
    cflags => \@cflags, 
    cppflags => \@cflags, 
    bindir => "$PWD/bin", 
); 

這是不同的,他的#1,因爲@cflags陣列和鍵cflagscppflags的值都與同一個陣列。改變他們中的任何一個,其他人會反映這個改變。也許這就是你想要的行爲,或者也許沒有,或者對你沒有任何影響,但它就是這樣。