'u boş değilse (aksi halde boolean anlamda true) @c
alma niyetiyle @a = @b || @c
atamasının bazı kıvrımlı varyasyonlarını gerçekleştirmek istiyorum. Belgeler açıkçası bana yapamayacağımı söylüyor. (Ve çok doğru aslında ilgili!)Neden b'yi atayamıyorum || Perl'de @ c to?
"||", "//" ve "& &" operatörleri ( değerlendirdi son değeri döndürmek C'ler "||" ve "& & aksine ", 0 veya 1 döndüren).
[...] Özellikle
, bu atama için ikisi arasında agrega seçimi için bu kullanmaması gerektiğini anlamı : Maalesef
@a = @b || @c; # this is wrong @a = scalar(@b) || @c; # really meant this @a = @b ? @b : @c; # this works fine, though
, gerçekten değil nedenini söyle.
@a =
sağ taraftaki liste bağlamı uyaran, bir dizi atama: Ben ne olacağını tahmin Nebu oldu. Liste bağlamında değerlendirilmek üzere, sağ taraftaki
@b || @c
. C-stili kısa devre mantıksal veya||
. Soldan sağa doğru değerlendirir (gerekirse) ve içeriği yayar. Liste bağlamında@b
değerlendirilir. Eğer doğru değilse (i.e., boş olmayan), geri döndürülür.- değilse,
@c
liste bağlamında değerlendirilir ve döndürülür.
Açıkçası, sondan bir önceki satırım yanlıştır. Niye ya? Ve daha önemlisi, bu davranış için belgelerin veya kaynakların hangi kısmı var?
Not: Sorunun kapsamı dışında, ben üçlü operatörü kullanarak dokümantasyonu önerisi kaçınmaları nedeni benim @b
aslında bir geçici (bir işlev çağrısı sonuç) olmasıdır.
"Bunu gerçekten kastediyor" yazan satır nedenini anlatıyor. –
Bu benim için neden daha çok bir şey. Ama ben önyargılıyım. –
"Gerçekten bunu kastediyorum" yorumunun "gerçekten anlamında" olması gerektiğini düşünüyorum. Olduğu gibi, scalar() 'ın değişmesi için, @a' a eşittir - yani yazarın gerçekten KULLANMASI için ne demek istediğini - yani açıkça böyle değil. Bunun yerine, ilk satır gerçekten ikinci satırı ETTİ; ikisi de aynı sonucu alır, bu da istenen cevap değildir. – Rini