2010-05-22 7 views
7

Parantez içinde, parantezler öncelikli olarak (çoğu programlama dilinde olduğu gibi) yanı sıra listeler oluşturmak için kullanılır. Belirli bir çift paritenin bir grup oluşturma veya tek eleman listesi olarak ele alınacağını nasıl anlarım?Perl kodundaki bir grup parenin gruplandırma olarak mı yoksa liste oluşturması mı gerektiğini nasıl anlayabilirim?

Örneğin, bunun bir skaler ve tek öğeli bir liste olmadığından eminim: (1 + 1)
Peki ya daha karmaşık ifadeler? Anlatmanın kolay bir yolu var mı?

+0

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);' –

+0

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

+0

Sanırım her zaman listeler ve dizileri temelde eşdeğer ve değişebilir olarak düşünmüştüm, ama değiller. –

cevap

16

üç ö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. 
    
8
  1. Bağlam.
  2. Parantezler, bir liste oluştururken sahip olduklarını düşündüğünüz role sahip değillerdir.

Örnekler:

$x = 1 + 1; # $x is 2. 
$x = (1 + 1); # $x is 2. 
@x = 1 + 1; # @x is (2). 
@x = (1 + 1); # @x is (2). 

$x = (1 + 1, 1 + 2); # $x is 3. 
@x = (1 + 1, 1 + 2); # @x is (2, 3). 

Kabaca liste kapsamında virgül operatörü listenin öğeleri ayıran içinde, konuşma; Skaler bağlamda virgül operatörü, sol ve sağ taraflarını değerlendiren ve sağ tarafın değerini döndüren C "seri virgül" dir. Skaler bağlamda, parantez grubu ifadeleri işlem sırasını geçersiz kılmak için ifadeler ve liste bağlamında parantezler ... aynı şeyi gerçekten yapar.onlar diziler için atama ilgili konum nedeni şudur: Sorunuza gelince

# Comma has precedence below assignment. 
# @a is assigned (1), 2 and 3 are discarded. 
@a = 1, 2, 3; 

# @a is (1, 2, 3). 
@a = (1, 2, 3); 

sadece tek başına bir ifadenin sormak için anlamlı bir soru değil, "bir sayıl veya tek unsur listesidir" bağlam nedeniyle. Liste bağlamında, her şey bir listedir; Skaler bağlamda hiçbir şey yoktur.

Tavsiye edilen okuma: perlop, perldata, Programlama Perl.

+0

Virgül operatörünü göstermek için Deparse'i seviyorum: perl -MO = Deparse -le 'my = 1,3,4; "@s" yazdı BEGIN {$/= "\ n"; $ \ = "\ n"; my (@s) = 1, '???', '???'; print "@s"; -e sözdizimi Tamam –

İlgili konular