2011-10-06 50 views
1

我是Perl新手,正在嘗試一下。我有這個代碼:Perl:語法錯誤「)[」。 array slicing

use Digest::MD5 'md5'; 
use Data::Dumper::Perltidy; 

my $data = "x"; 
my $digest = md5($data); 

# print first 6 elements 
print Dumper map(ord, split(//, $digest))[0..5]; 

但是,這失敗了語法錯誤。我記得PHP有類似的問題,他們計劃在未來的版本中解決這個問題。 Perl仍然存在這個問題,還是隻是錯誤的做法?如何纔是正確的方法?

回答

7

您試圖標應用到地圖的功能,而不是它的值。

print Dumper +(map(ord, split(//, $a)))[0 .. 5]; 

會做你所期望的。請注意使用+符號來解決歧義。

10

你需要附上map括號中的切片工作,例如:

print Dumper((map ord, split(//, $digest))[0..5]); 
+0

這仍然失敗,語法錯誤?你確定?這是什麼時候引入的? – Albert

+0

哎呀,我的壞。我也錯過了'Dumper'功能的零件。 – Albert

2

除了其他工作答案之外,考慮到限制map聲明的結果,您可以通過限制拆分獲得相同的結果。這將ord通過映射較少的數據和保存程序的一些工作:

print Dumper map(ord, (split(//, $digest))[0..5]); 

但由於分裂有這個建於它可以進一步簡化爲

print Dumper map(ord, split(//, $digest, 6)); 
+0

只是爲了說明這一點:Perl中的map不是懶惰的?有沒有懶惰的功能? – Albert

+0

在Perl 5中,由'map'爲每個輸入值執行的表達式或塊可能包含副作用。爲了確保任何副作用盡可能保持確定性,「map」按順序在所有輸入值中按順序執行。 Perl幾乎沒有希望能夠識別'map'何時沒有副作用並將其轉換爲lazy'map',認爲Perl允許覆蓋可能導致調用的'&CORE :: GLOBAL :: ord' to'ord'有副作用。 –