SORU
4 Mart 2010, PERŞEMBE


Perl: (liste öğesi )

Bir listedeki bir elemanın varlığını arıyorum.

Python in bir anahtar kelime var ve böyle bir şey yapacağımı:

if element in list:
    doTask

Bir el tüm liste boyunca yineleme zorunda kalmadan Perl eşdeğer var mı?

CEVAP
5 Mart 2010, Cuma


Uzak Perl v5 gerektiren alabilirsiniz.10, aşağıdaki örneklerden birini kullanabilirsiniz.

  • smart match ~~ operatör.

    if( $element ~~ @list ){ ... }
    if( $element ~~ [ 1, 2, 3 ] ){ ... }
    
  • Ayrıca given/when inşa kullanabilirsiniz. Smart maç işlevleri DAHİLİ olarak kullanır.

    given( $element ){
       when( @list ){ ... }
    }
    
  • Ayrıca bir for bir döngü kullanabilirsiniz "" ($_ ayarlar anlamı ). topicalizer

    for( @elements ){
       when( @list ){ ... }
    }
    

Perl 5.12 içinde çıkacak bir şey when post-fix sürümünü kullanmak için yeteneğidir. if unless gibi hatta daha fazlasını yapar.

given( $element ){
  ... when @list;
}

Eğer Perl eski sürümleri üzerinde çalıştırmak için varsa, hala birkaç seçenek vardır.

  • Uzak List::Util::first, kullanarak alabilirsiniz düşünebilirsiniz ama sorunlu bir kenar koşulları vardır.

    Bu örnekte başarıyla 0 karşı maç yapmak istiyoruz bu oldukça açıktır. Ne yazık ki bu kod failure her zaman baskı olur.

    use List::Util qw'first';
    my $element = 0;
    if( first { $element eq $_ } 0..9 ){
      print "success\n";
    } else {
      print "failure\n";
    }
    

    -Ness tanımlanan first dönüş değeri kontrol edebilirsin, ama eğer biz aslında undef karşı bir maç başarılı olmak istiyorsanız başarısız olur.

  • Güvenle grep ancak kullanabilirsiniz.

    if( grep { $element eq $_ } 0..9 ){ ... }
    

    Bu grep skaler bağlamda çağrılır çünkü güvenlidir. Diziler skaler bağlamda aradığında öğe sayısını döndürür. Bu undef karşı maç için çalışırsak bile çalışmaya devam edecektir.

  • for çevreleyen bir döngü kullanabilirsiniz. Sadece başarılı bir maç döngü dışına çıkmak için last, Ara. Aksi halde bir kez daha kodunuz çalışan sonunda olabilir.

    for( @array ){
      if( $element eq $_ ){
        ...
        last;
      }
    }
    
  • if deyim durumuna içinde for döngü koyabilirsiniz ...

    if(
      do{
        my $match = 0;
        for( @list ){
          if( $element eq $_ ){
            $match = 1;
            last;
          }
        }
        $match; # the return value of the do block
      }
    ){
      ...
    }
    
  • ... ama if deyimi önce for döngü koymak için daha net olabilir.

    my $match = 0;
    for( @list ){
      if( $_ eq $element ){
        $match = 1;
        last;
      }
    }
    
    if( $match ){ ... }
    
  • Eğer sadece dizeleri eşleşen karşı iseniz, bir karma kullanabilirsiniz. Bu @list büyükse programınızı hızlandırabilirve, %hash karşı defalarca maç olacak. Özellikle @array o zaman sadece %hash yük bir kez çünkü değiştirmek değilse.

    my %hash = map { $_, 1 } @array;
    if( $hash{ $element } ){ ... }
    
  • Ayrıca kendi yordam yapabilirsin. Bu prototypes kullanmak faydalı olduğu durumlardan biri.

    sub in(&@){
      local $_;
      my $code = shift;
      for( @_ ){ # sets $_
        if( $code->() ){
          return 1;
        }
      }
      return 0;
    }
    
    if( in { $element eq $_ } @list ){ ... }
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kindlechatmail

    kindlechatma

    25 AĞUSTOS 2010
  • Mary Jane Tauyan

    Mary Jane Ta

    20 AĞUSTOS 2009
  • Phymec

    Phymec

    18 Temmuz 2009