2014-10-07 46 views
2
@rt = (10,9,8); 
my ($x)[email protected]; 
$y = @rt; 
$z = (10,9,8); 
print "\$x=$x,\$y=$y,\$z=$z\n"; 

輸出: $ X = 10,$ Y = 3,$ Z = 8爲什麼這些分配數組/列表的不同方法導致不同的值?

爲什麼的$ X,$ Y的值,$ z是不同? 爲什麼$ z值不等於@rt的大小?

$x = $rt[0] 
$y = Scalar(@rt) 
$z = $rt[2] 

爲什麼將數組賦值給標量的差別不同,它們有不同的值?這讓我覺得Perl很乏味,或者在編碼時需要小心。請對此發表評論。

+2

因爲它是perl ..和3種形式是不同的。這部分是值得回答的。然而,「評論」perl單調乏味或需要更多關心的請求並不是對第一個問題的補充。 – user2864740 2014-10-07 07:22:14

+0

「數組」是一種變量類型,不是值類型。值是標量或列表。 – ysth 2014-10-07 07:44:45

+1

幾乎所有的編程語言在編碼時都需要小心。 – 2014-10-07 08:56:04

回答

2

左側的變量列表(列表上下文)和右側的列表分配相應的項目。在左邊第一個,也是唯一的,項目從列表中獲得的第一個項目:在左側

my ($x)[email protected]; # x = rt[0] 

標量,列表右側。在標量上下文列表進行評估,轉化爲它的長度:

$y = @rt; # y = size of rt 

最後一個是comma operator,在標量上下文計算結果爲右側的最後一個項目。

$z = (10,9,8); # z = 8; 
9

Perl有兩個不同的賦值運算符,一個標量賦值運算符和一個列表賦值運算符。哪一項任務是基於句法上的左側出現的內容;如果這是一個數組,一個哈希,一個切片或一個帶括號的表達式,它就是一個列表分配;否則它是一個標量分配。列表分配給出它們的右操作數列表上下文;標量賦值給出了它們的右操作數標量上下文。

以逐一時間:

@rt = (10,9,8); 

名單分配。右操作數獲取列表上下文。列表上下文中的逗號運算符組裝一個列表,然後將其分配到數組中。

my ($x) = @rt; 

列表分配。右操作數獲取列表上下文;列表上下文中的數組會生成其元素列表,這些元素被分配到列表賦值左操作數的列表中。因爲該列表只有一個標量元素,所以只有數組的第一個元素被分配,並且從該數組產生的列表的其餘元素將被丟棄。

$y = @rt; 

標量分配。右操作數獲得標量上下文;標量上下文中的數組會生成其長度,該長度將分配給賦值左側的變量。

$z = (10,9,8); 

標量分配。右操作數獲取標量上下文。標量上下文中的逗號運算符將拋出左操作數並僅返回其右操作數,因此賦值左操作數的值僅爲分配給賦值左側變量的數字8。

相關問題