是否可以在perl中創建一個字符串變量數組,而無需指定數組中的每個單個字符串?就像使用字母和數字的「..」快捷鍵一樣。Perl數組快捷鍵
例如:
$v1 = "hey";
$v2 = "hello";
$v3 = "bye";
$v4 = "welcome";
@f = ("$v1" .. "$v4");
使得打印$ F [2];將等於「再見」...
是否可以在perl中創建一個字符串變量數組,而無需指定數組中的每個單個字符串?就像使用字母和數字的「..」快捷鍵一樣。Perl數組快捷鍵
例如:
$v1 = "hey";
$v2 = "hello";
$v3 = "bye";
$v4 = "welcome";
@f = ("$v1" .. "$v4");
使得打印$ F [2];將等於「再見」...
這可以 - 但應該不能 - 通過使用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]
。也就是說,馬上給數組賦值。
這是你的意思嗎?
my @v = qw/hey hello bye welcome/;
print join "\n", @v;
在創建這個ARRAY
,你可以用
print $v[0];
其中0
是ARRAY
的索引來訪問任何項目:哎在我們的案例。
否,$ v1到$ v4由腳本中的其他用戶填充。我希望能夠在腳本中將所有這些數據放在較低的數組中,而不必再次鍵入它們。這是幾個變量和幾個數組,這就是爲什麼我問這個問題,因爲它會減少我的代碼。 – Fred
我想你可以編寫一個程序來使用eval來做到這一點,但爲什麼首先使用$ v1,$ v2呢?爲什麼不從數組開始?
或許,這取決於你真正需要做的,使用類似
@f = qw(hey hello bye welcome);
$ v1到$ v4由其他用戶完成,對perl知之甚少。我希望能夠在腳本下部的數組中獲得這些變量,而無需再次輸入它們。我簡化了,但它更像是$ v1到$ v35和幾個數組($ w1到$ w40)等等。 – Fred
「由其他用戶完成」 - 如果他們有類似'$ v1 = [add data here]; $ v2 = [在這裏添加數據],如何將其更改爲'@v [1] = [在此處添加數據]; @v [2] = [在這裏添加數據];'? – theglauber
Ooops,在上面,數組變量的正確語法是'$ [1],$ [2]'等 – theglauber
我不激動不已的辦法,但你可以這樣做:
$v1 = "hey";
$v2 = "hello";
$v3 = "bye";
$v4 = "welcome";
@f = map{eval "\$v$_"}1..4;
我接受了這個迴應,這是eval的一個聰明用法,但我擔心使用中的安全風險這種方法。有什麼想法嗎? – Fred
應該沒有風險,除非用戶也定義了變量的名稱。我在作品中有類似的答案,即將推出 –
如果'$ v1'等是'my'變量(他們應該是),那麼實際上我認爲這種方法是最好的。如果他們是'我們'的變量(如你的例子所示),那麼你可以通過符號引用(暫時做'沒有嚴格的'引用';'然後,工具可能是正確的,你真的應該使用散列,然後你可以隨意得到名字或數值 –
你可能可以,但你應該考慮使用一個數組或一個散列而不是幾個標量:http://perldoc.perl.org/perlfaq7.html(我怎樣才能使用變量作爲變量名?) – toolic