Гарантируется ли перезапись% hash1 на% hash2 при возникновении конфликта? - PullRequest
3 голосов
/ 22 июля 2011
%args = (%hash1,%hash2);

Гарантируется ли перезапись %hash1 на %hash2 при возникновении конфликта в Perl?

Ответы [ 3 ]

6 голосов
/ 22 июля 2011

Да, это так. Более поздние ключи перезаписывают более ранние.

4 голосов
/ 22 июля 2011

Если вы не видите перезаписывающего поведения, значит, вы делаете что-то не так:

#!/usr/bin/perl

use strict;
use warnings;

sub func { print "func\n" }
sub tion { print "tion\n" }

my %args = (
    handler => \&tion,
);

my $dispatch = {
    handler => \&func,
    %args
};

$dispatch->{handler}();

С perldoc perlglossary:

  • список
    Упорядоченный набор скалярных значений.

С perldoc perldata:

Списки выполняют автоматическую интерполяцию подсписков. То есть, когда LIST оценивается, каждый элемент списка оценивается в контексте списка, и результирующее значение списка интерполируется в LIST так же, как если бы каждый отдельный элемент был членом LIST. Таким образом, массивы и хэши теряют свою идентичность в списке

и

Хеш может быть инициализирован с использованием литерального списка, содержащего пары элементов, которые должны интерпретироваться как ключ и значение.

Практический результат заключается в том, что хэш в контексте списка дает список пар ключ / значение. Когда у этого списка есть порядок (порядок, в котором он был возвращен), вам никогда не гарантируется, в каком порядке будут возвращаться ключи и значения, но списки гарантируют порядок их элементов, поэтому (a => 1, %h) создает список, который начинается с "a", затем 1, затем первый ключ, возвращаемый %h, затем первое значение, возвращаемое %h, и так далее. Этот список затем присваивается целевому хешу в порядке списка, что означает, что если ключ "a" находится в %h, то он будет переопределять оригинал.

0 голосов
/ 22 июля 2011

Нет.% hash1 вообще не изменяется этим оператором.

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