2013-02-10 22 views
6

Başlıktan anlaşılacağı gibi, perl, varolan elemanların sorgulamalarından sonra dizilere kukla öğeler ekler. Dizi boyutu sorgulamadan sonra büyür. davranışlara İllüstrasyon:perl, sorgudan sonra diziye yapay elemanlar ekler

my $rarr; 
    $rarr->[0][0] = 'S'; 
    $rarr->[0][1] = 'MD'; 
    $rarr->[1][0] = 'S'; 
    $rarr->[1][1] = 'PRP'; 

    my $crulesref; 
    $crulesref->[0] = $rarr; 

    check_rule('aa', 0); 
    if($rarr->[3][0] == 'M'){ # just check a not existing element 
     print "m\n"; 
    } 

    check_rule('bb', 0); 
    if($rarr->[5][0] == 'M'){ # again: just check a not existing element 
     print "m\n"; 
    } 
    check_rule('cc', 0); 


    sub check_rule($$) 
    { 
     my ($strg,$ix) = @_; 
     my $aref = $crulesref->[$ix]; 
     my $rule_size = @$aref; 
     {print "-----$strg aref:$aref rs:$rule_size aref:'@$aref'\n"; 
      for(my $t1 = 0; $t1 <$rule_size; $t1++){ 
      print "t1:$t1 0:$aref->[$t1][0] 1:$aref->[$t1][1]\n"; 
      } 
     } 
     } 

çalışmasının sonucudur:

[email protected] ~/dtest/perl/forditas/utf8_v1/forditas/test1 $ perl v15.pl 
    -----aa aref:ARRAY(0x90ed8c8) rs:2 aref:'ARRAY(0x9106cac) ARRAY(0x9106d24)' 
    t1:0 0:S 1:MD 
    t1:1 0:S 1:PRP 
    m      <-------------- finds the non existing 
    -----bb aref:ARRAY(0x90ed8c8) rs:4 aref:'ARRAY(0x9106cac) ARRAY(0x9106d24)   ARRAY(0x9107508)' 
    t1:0 0:S 1:MD 
    t1:1 0:S 1:PRP 
    t1:2 0: 1:    <-- undesired dummy due to inquiry 
    t1:3 0: 1:    <-- undesired dummy due to inquiry 
    m      <-------------- finds the non existing 
    -----cc aref:ARRAY(0x90ed8c8) rs:6 aref:'ARRAY(0x9106cac) ARRAY(0x9106d24) ARRAY(0x9107904) ARRAY(0x9107508) ARRAY(0x910e860)' 
    t1:0 0:S 1:MD 
    t1:1 0:S 1:PRP 
    t1:2 0: 1:    <-- undesired dummy due to inquiry 
    t1:3 0: 1:    <-- undesired dummy due to inquiry 
    t1:4 0: 1:    <-- undesired dummy due to inquiry 
    t1:5 0: 1:    <-- undesired dummy due to inquiry 

her soruşturma önce sormak daha Bunu önlemek için başka bir yol sorgulama yapılan eleman varsa, var mı? Hızını artırmaya çalışıyorum ve bu sorular kodu yavaşlatıyor ve okumayı daha kolay hale getiriyor.

Yararlı ipuçları için şimdiden teşekkür ederiz.

+0

Bulunamıyorsa, hatalı soruşturma geliyor. == yerine bir eq kullanmalısınız. Ancak, bu ana sorun değildir. Ana probim, elementlerin eklenmesidir. – eleonora

cevap

12

Gördüğünüz autovivification. Hatta sadece bir çek ile $ref->[3][0] hafızasını erişirseniz: kendi eleman sayısı sıfır kontrol edilebilir önce autovivification yoluyla oluşturulur böylece

if ($ref->[3][0] eq 'M') 

Sonra ilk $ref->[3], bulunmalıdır. İlk olarak, $ref->[3]'un mevcut olup olmadığını veya oluşturulmasını önlemek için tanımlanmış olup olmadığını kontrol etmeniz gerekir.

if (defined($ref->[3]) && $ref->[3][0] eq 'M') 

Ayrıca, her zaman kullanmalısınız: dize 'M' dönüştürülür çünkü maddelik eğer burada yanlış pozitif verir

use strict; 
use warnings; 

Sonra uyarıları

Argument "M" isn't numeric in numeric eq (==) at ... 
Use of uninitialized value in numeric eq (==) at ... 

görecekti sayısal eşitlik operatörü == tarafından verilen bağlam nedeniyle bir sayı (0). LHS değeri de bir sayıya (0) dönüştürülmüş olan undef şeklindedir, bu nedenle ifade doğru olarak değerlendirilir.

+6

'if ($ ref -> [3] && $ ref -> [3] [0] eq 'M')' yeterli olurdu – ikegami

+3

@ikegami Evet, ama gösteri uğruna, belki de iyi bir fikir olabilir özel. – TLP

+0

Eğer _really_ spesifik olmak istediysen, kesinlikle bu olsaydı eğer (ref ($ ref -> [3]) eq 'ARRAY' && $ ref -> [3] [0] eq 'M') '. –