2012-10-24 107 views
3

是否可以在perl中創建一個字符串變量數組,而無需指定數組中的每個單個字符串?就像使用字母和數字的「..」快捷鍵一樣。Perl數組快捷鍵

例如:

$v1 = "hey"; 
$v2 = "hello"; 
$v3 = "bye"; 
$v4 = "welcome"; 

@f = ("$v1" .. "$v4"); 

使得打印$ F [2];將等於「再見」...

+1

你可能可以,但你應該考慮使用一個數組或一個散列而不是幾個標量:http://perldoc.perl.org/perlfaq7.html(我怎樣才能使用變量作爲變量名?) – toolic

回答

1

這可以 - 但應該不能 - 通過使用no strict 'refs'來解決。而且巧合的是no strict 'vars'

use strict; 
use warnings; 
use Data::Dumper; 

{ 
    no strict 'vars'; 
    $v1 = "hey"; 
    $v2 = "hello"; 
    $v3 = "bye"; 
    $v4 = "welcome"; 

    no strict 'refs'; 
    my @f = map ${'v'.$_},1..4; 
    print Dumper \@f; 
} 

輸出:(SANS警告)

$VAR1 = [ 
      'hey', 
      'hello', 
      'bye', 
      'welcome' 
     ]; 

我們需要no strict 'vars',因爲我們確實需要參考的(真正)評選的變量$main::v1等。事實上,我們可以使用完整名稱避開no strict 'vars'的需求。如果你不嚴格使用,這甚至不是問題。雖然不使用strict就像在警告燈上貼上標籤來解決汽車發動機問題一樣聰明:它不會保存發動機故障。

你應該這樣做嗎?幾乎不。總是有辦法繞過它。但以這種方式做這件事並不可怕,假設你不會像這樣作弊。

正確方式是不是使用$v1 ...... $v1000,使用$v[0],... $v[1000]。也就是說,馬上給數組賦值。

+0

當然!首先給數組賦值,非常聰明,我沒有想到這個!這就解決了這個問題,並且沒有必要使用eval或者與嚴格的變量玩耍。你們都很聰明,你們的回答非常有幫助,而且很有洞察力對不起,我誤解了那些爲什麼不以數組開頭的人,這可能是你的意思 – Fred

+0

不客氣,有時候簡單的答案是很難看到。 – TLP

1

這是你的意思嗎?

my @v = qw/hey hello bye welcome/; 

print join "\n", @v; 

在創建這個ARRAY,你可以用

print $v[0]; 

其中0ARRAY的索引來訪問任何項目:在我們的案例。

+0

否,$ v1到$ v4由腳本中的其他用戶填充。我希望能夠在腳本中將所有這些數據放在較低的數組中,而不必再次鍵入它們。這是幾個變量和幾個數組,這就是爲什麼我問這個問題,因爲它會減少我的代碼。 – Fred

1

我想你可以編寫一個程序來使用eval來做到這一點,但爲什麼首先使用$ v1,$ v2呢?爲什麼不從數組開始?

或許,這取決於你真正需要做的,使用類似

@f = qw(hey hello bye welcome);

+0

$ v1到$ v4由其他用戶完成,對perl知之甚少。我希望能夠在腳本下部的數組中獲得這些變量,而無需再次輸入它們。我簡化了,但它更像是$ v1到$ v35和幾個數組($ w1到$ w40)等等。 – Fred

+0

「由其他用戶完成」 - 如果他們有類似'$ v1 = [add data here]; $ v2 = [在這裏添加數據],如何將其更改爲'@v [1] = [在此處添加數據]; @v [2] = [在這裏添加數據];'? – theglauber

+0

Ooops,在上面,數組變量的正確語法是'$ [1],$ [2]'等 – theglauber

2

我不激動不已的辦法,但你可以這樣做:

$v1 = "hey"; 
$v2 = "hello"; 
$v3 = "bye"; 
$v4 = "welcome"; 

@f = map{eval "\$v$_"}1..4; 
+1

我接受了這個迴應,這是eval的一個聰明用法,但我擔心使用中的安全風險這種方法。有什麼想法嗎? – Fred

+0

應該沒有風險,除非用戶也定義了變量的名稱。我在作品中有類似的答案,即將推出 –

+0

如果'$ v1'等是'my'變量(他們應該是),那麼實際上我認爲這種方法是最好的。如果他們是'我們'的變量(如你的例子所示),那麼你可以通過符號引用(暫時做'沒有嚴格的'引用';'然後,工具可能是正確的,你真的應該使用散列,然後你可以隨意得到名字或數值 –