üç önemli ilkeler burada yararlıdır:
Bağlam kraldır. Örneğinizin (1 + 1)
'un değerlendirmesi, içeriğe göre değişir. Bir skaler bağlamda
$x = (1 + 1); # Scalar context. $x will equal 2. Parentheses do nothing here.
@y = (1 + 1); # List context. @y will contain one element: (2).
# Parens do nothing (see below), aside from following
# syntax conventions.
, bir liste diye bir şey yoktur. Bunu görmek için, skaler değişkenin bir listesi olmak üzere
'un görünmesini sağlamaya çalışın. Bunu düşünmenin yolu, virgül operatörünün davranışına odaklanmaktır: skaler bağlamda, sol argümanını değerlendirir, bu değeri atar, sonra doğru argümanını değerlendirir ve bu değeri verir. Liste bağlamında, virgül operatörü her iki argümanı da listeye ekler.
@arr = (12, 34, 56); # Right side returns a list.
$x = (12, 34, 56); # Right side returns 56. Also, we get warnings
# about 12 and 34 being used in void context.
$x = (@arr, 7); # Right side returns 7. And we get a warning
# about using an array in a void context.
Parantezler listeleri oluşturmayın. Virgül operatörü listeyi oluşturur (liste kapsamında olduğumuz sürece). Perl kodunda listeler yazarken, öncelikli nedenler için parantezler gereklidir - liste oluşturma nedenlerinden değil. Birkaç örnek: biz skaler bağlamda bir dizi değerlendiriyoruz, bu nedenle sağ taraf dizi boyutunu verir:
parantez hiçbir etkisi yoktur.
$x = (@arr);
Parantez tek eleman ile bir liste oluşturmak için gerekli değildir.
@arr = 33; # Works fine, with @arr equal to (33).
Ancak parantezler birden fazla öğe ile gereklidir - öncelikli nedenler için.
@arr = 12, 34, 56; # @arr equals (12). And we get warnings about using
# 34 and 56 in void context.
Sanırım kazara sonuç olarak bir sonuç içeren bir tek öğe listesini yanlışlıkla skaler'e atamaktan endişeleniyorum. Ama eğer cevapları doğru bir şekilde okuyorsam, bu gerçekten imkansızdır, eğer x $ = @ {[1 + 1]}; gibi bir şey yapmazsam. Bir skalaya bir liste atamak, bir diziyi bir skalaya atamaktan farklıdır. Bir skaler için bir dizi içeren bir liste atarsanız ne olur? '$ x = (@list);' –
Bir ödevde, sol taraf, sağ tarafın değerlendirileceği bağlamı belirler. Bu nedenle, bir skaler değişkene bir dizi atadığınızda, dizi skalar bağlamda değerlendirilir. Skaler bağlamda değerlendirilen bir dizi, dizi içindeki öğe sayısını döndürür. Yorumunuzdaki her iki örnek de bu kategoriye girer. Ayrıca burada skaler bağlamdaki bir dizinin değerlendirilmesi hakkında konuştuğumuza dikkat edin. Skaler bağlamda bir liste hakkında konuşmuyoruz çünkü skaler bağlamda hiç liste yok. – FMc
Sanırım her zaman listeler ve dizileri temelde eşdeğer ve değişebilir olarak düşünmüştüm, ama değiller. –