В Perl, как мне обработать весь хэш? - PullRequest
7 голосов
/ 09 декабря 2010

Я хотел бы обработать все элементы хеш-таблицы в Perl. Как я могу это сделать?


Это вопрос от официального perlfaq . Мы импортируем perlfaq в Stack Overflow .

1 Ответ

7 голосов
/ 09 декабря 2010

(Это официальный ответ perlfaq , за вычетом любых последующих изменений)

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

Чтобы просмотреть все клавиши, используйте функцию клавиш . Это извлекает все ключи хеша и возвращает их вам в виде списка. Затем вы можете получить значение через конкретный ключ, который вы обрабатываете:

foreach my $key ( keys %hash ) {
    my $value = $hash{$key}
    ...
    }

Когда у вас есть список ключей, вы можете обработать этот список перед обработкой элементов хеша. Например, вы можете отсортировать ключи, чтобы обрабатывать их в лексическом порядке:

foreach my $key ( sort keys %hash ) {
    my $value = $hash{$key}
    ...
    }

Или, возможно, вы захотите обработать только некоторые элементы. Если вы хотите работать только с ключами, начинающимися с text :, вы можете выбрать только те, которые используют grep:

foreach my $key ( grep /^text:/, keys %hash ) {
    my $value = $hash{$key}
    ...
    }

Если хеш очень большой, вы можете не захотеть создавать длинный список ключей. Чтобы сэкономить память, вы можете получить одну пару ключ-значение за раз, используя each () , которая возвращает пару, которую вы еще не видели:

while( my( $key, $value ) = each( %hash ) ) {
    ...
    }

Каждый оператор возвращает пары в случайном порядке, поэтому, если порядок важен для вас, вам придется придерживаться метода ключей.

Оператор each () может быть немного сложнее. Вы не можете добавлять или удалять ключи хэша, пока используете его, без возможности пропустить или повторно обработать некоторые пары после того, как Perl внутренне перепроверяет все элементы. Кроме того, хеш имеет только один итератор, поэтому если вы используете ключи , значения или каждый в одном и том же хеше, вы можете сбросить итератор и испортить ваша обработка. См. каждую запись в perlfunc для получения более подробной информации.

...