2013-01-21 10 views
6

Bunu yapmanın daha iyi bir yolu var mı? ile ve Pars olmadanKoşulsal olarak Perl'de 2 diziden 1'e kadar itme

push $s eq 'YES' ? @x : @y, $r; 

ama imkânsız:

my (@x, @y); 
my $r = [$v1, $v2, $v3]; 
push @x, $r if $s eq 'YES'; 
push @y, $r if $s ne 'YES'; 

kullanıyorum çalıştı: Ben bir sayısal değerine dayanarak 2 diziler oluşturmaya çalışıyorum.

Hata geçerli:

Type of arg 1 to push must be array (not null operation) at comp_report.pl line 79, near "$r;" 
+0

Sanırım kodunuz as_is. Ben bir değişkeni atamaktan başka bir şey için bir * üçlü operatör * kullanmak kötü bir alışkanlıktır (Perl * üçlü operatör ile ne yapılabilir * bazen diğer dillerdeki uygulamalarda çoğaltılamaz) –

cevap

13

itme, gerçek bir dizi (en azından daha önce perl 5.14 ve önceki - bu değişmiş olabilir) olmak ilk parametre gerektirir Gerekirse bu nedenle, değil bir ifade:

push @{ $s eq 'YES' ? \@x : \@y}, $r; 
5.14 başlayarak

böyle itme experimentally can take arbitrary hard references olarak builtins, bu nedenle bu işleri:

push $s eq 'YES' ? \@x : \@y, $r; 
+0

+1 Sadece birkaç saniye önce Aynı cevap [burada] (http://stackoverflow.com/a/14446203/1337398). :) – speakr

9
push @{ $s eq 'YES' ? \@x : \@y }, $r; 

push gerçekten ilk argümanı olarak bir dizi almak istiyor, ancak yine de referansları kullanarak hedefi dinamik olarak seçebilirsiniz.

1

Tercih ettiğim çözüm

if($s eq 'YES'){ 
    push @x, $r; 
else{ 
    push @y, $r; 
} 

Sadece bir stil şey olurdu. İçe itmek için ilk argüman olarak üçlü bir ifadeyi kullanmak bana dağınık görünüyor ve ekstra çizgileri umursamıyorum. Kişisel tadı sanırım!

+0

Çok fazla derinleşmeden, "l değerleri" nizin yanı sıra "r değerleri" üzerinde kontrol sahibi olmak dinamik bir dilde beklediğim bir şeydir. Örneğin, Lisp'de yaygın bir deyim. Perl'in bununla savaştığına şaşırdım ve gerçekten mümkün olup olmadığını bilmek istedim. – jeberle