كيف يمكنني معرفة ما إذا تجزئة بيرل بالفعل مفتاح معين؟

StackOverflow https://stackoverflow.com/questions/1003632

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي مخطوطة برل التي تعول عدد من الحوادث سلاسل مختلفة في ملف نصي. أريد أن أكون قادرة على معرفة ما اذا كان سلسلة معينة ليست بعد مفتاح في التجزئة. هل هناك طريقة أفضل للقيام بذلك تماما؟

وهنا هو ما أقوم به:

foreach $line (@lines){
    if(($line =~ m|my regex|) )
    {
        $string = $1;
        if ($string is not a key in %strings) # "strings" is an associative array
        {
            $strings{$string} = 1;
        }
        else
        {
            $n = ($strings{$string});
            $strings{$string} = $n +1;
        }
    }
}
هل كانت مفيدة؟

المحلول

وأعتقد للتحقق ما إذا كان يوجد مفتاح في تجزئة على القيام بذلك تماما

if (exists $strings{$string}) {
    ...
} else {
    ...
}

نصائح أخرى

وأود أن محامي ضد استخدام if ($hash{$key}) لأنها لن تفعل ما كنت تتوقع في حالة وجود مفتاح ولكن قيمته صفر أو فارغة.

حسنا، رمز كله يمكن أن تقتصر على:

foreach $line (@lines){
        $strings{$1}++ if $line =~ m|my regex|;
}

إذا كانت القيمة لم يكن هناك، سوف مشغل يفترض أنه ++ أن تكون 0 (ومن ثم زيادة إلى 1). إذا كان هناك بالفعل - فإنه ببساطة يمكن زيادة

وأعتقد أن هذا الرمز يجب أن يجيب على سؤالك:

use strict;
use warnings;

my @keys = qw/one two three two/;
my %hash;
for my $key (@keys)
{
    $hash{$key}++;
}

for my $key (keys %hash)
{
   print "$key: ", $hash{$key}, "\n";
}

وإخراج:

three: 1
one: 1
two: 2

ويمكن تبسيط التكرار إلى:

$hash{$_}++ for (@keys);

و(انظر $_ في perlvar .) ويمكنك حتى كتابة شيء من هذا القبيل:

$hash{$_}++ or print "Found new value: $_.\n" for (@keys);

والتي تفيد كل أساسيا للمرة الأولى وجدت ذلك.

ويمكنك الذهاب للتو مع:

if(!$strings{$string}) ....
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top