Perl ha sh, а l oop не может найти значение ключа - PullRequest
2 голосов
/ 25 мая 2020

Меня смущает один perl вопрос, у кого-нибудь есть идеи?

I use one hash structure to store the keys and values like:
$hash{1} - > a;
$hash{2} - > b;
$hash{3} - > c;
$hash{4} - > d;
....
more than 1000 lines. I give a name like %hash

а затем я планирую использовать один оператор l oop для поиска всех ключей, чтобы увидеть, будет ли он соответствует значению из файла.

  for example, below is the file content:
  first line 1
  second line 2
  nothing
  another line 3

my logi c is:

while(read line){

    while (($key, $value) = each (%hash))
    {
      if ($line =~/$key/i){
         print "found";
   }
}

so my expectation is :
first line 1     - > return found
second line 2     - > return found
nothing
another line 3    - > return found
....

However, during my testing, only first line and second line return found, for 'another line3', the 
program does not return 'found'
Note: the hash has more than 1000 records.

Поэтому я пытаюсь отладить его и добавить количество внутри и найти найденные В этом случае l oop выполнялся как 600 или 700 раз, но для случая 'another line3' он выполняется только около 300 раз и просто выходит из l oop и не возвращает найденный.

есть идеи, почему так происходит?

, и я провел еще одно тестирование: если моя структура ha sh мала, например, всего 10 ключей, logi c работает.

и я пытаюсь использовать foreach, и Похоже, что у foreach нет такой проблемы.

Ответы [ 2 ]

3 голосов
/ 25 мая 2020

Указанный вами псевдокод должен работать нормально, но может возникнуть небольшая проблема.

Если после того, как вы нашли свой ключ и распечатали его, вы закончите while l oop, в следующий раз каждый будет называется, он продолжится с того места, где вы уехали. Другими словами, «каждый» - это итератор, который сохраняет свое состояние в ha sh, который он перебирает.

В http://blogs.perl.org/users/rurban/2014/04/do-not-use-each.html автор объясняет это более подробно. Его вывод:

Таким образом, с каждым следует обращаться как с php: Избегайте этого, как чумы. Используйте его только в оптимизированных случаях, когда вы знаете, что делаете.

0 голосов
/ 25 мая 2020

Проблема не очень хорошо сформулирована OP, предоставленные образцы данных не подходят для демонстрационных целей.

Следующий пример кода представляет собой попытку, основанную на описании проблемы, предоставленном OP.

Recreate filter ha sh from DATA block, составить $re_filter состоящий из filter ha sh ключей, пройти по файлу, указанному в качестве аргумента в командной строке для фильтрации строк, соответствующих $re_filter.

use strict;
use warnings;

my $data = do { local $/; <DATA> };
my %hash = split ' ', $data;

my $re_filter = join('|',keys %hash);

/$re_filter/ && print for <>;

__DATA__
1   a
2   b
3   c
4   d

Содержание файла входных данных

first line 1
second line 2
nothing
another line 3

Выход

first line 1
second line 2
another line 3
...