Perl-хэши - сравнение ключей и значений - PullRequest
3 голосов
/ 18 апреля 2010

Я читал через Perl Doc, но я не могу разобраться с хэшами. Я пытаюсь найти, существует ли хэш-ключ, и если да, сравнить его значение. Меня смущает то, что мои поиски говорят, что вы нашли, существует ли ключ по if (exists $files{$key}), но что $files{$key} также дает значение? код, над которым я работаю:

foreach my $item(@new_contents) {
    next if !-f "$directory/$item";
    my $date_modified = (stat("$directory/$item"))[9];

    if (exists $files{$item}) {
        if ($files{$item} != $date_modified {
            $files{$item} = $date_modified;
            print "$item has been modified\n";
        }
    } else {
        $files{$item} = $date_modified;
        print "$item has been added\n";
    }
}

Ответы [ 2 ]

9 голосов
/ 18 апреля 2010

$files{$key} действительно вернет значение этого ключа. Но что, если это значение окажется ложным в логическом контексте, например 0 или '' (пустая строка)?

Рассмотрим хеш-код:

my %foo = ( red => 42, blue => 0, green => '', yellow => undef );

Если бы я сказал if ( $foo{blue} ), условие не состоялось бы. Даже если в хэше существует blue, условие ложно, поскольку значение $foo{blue} равно нулю. То же самое с клавишами green и yellow - пустые строки и undef являются ложными значениями.

Без exists не было бы (простого) способа определить, действительно ли ключ хеша действительно существует и его значение равно false, или его нет вообще. (Вы можете назвать keys, а затем grep получившийся список, но это смешно.)

Ваш код выглядит отлично для меня. Вы используете exists правильно.

3 голосов
/ 18 апреля 2010

exists $hash{key} говорит, что ключ существует, defined $hash{key} говорит, что ключ существует и его значение определено, $hash{key} говорит, существует ли ключ и имеет ли оно значение true (см. http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...