perl предотвращает дублирование значений ключей

#perl

#perl

Вопрос:

Я перебираю файл построчно, в нем есть пара ключ-> значение, которую я затем выводю в xml. Как я могу выполнить проверку, чтобы убедиться, что я еще не вывел эту пару ключ / значение? На C # я бы сделал это так просто, вставив в словарь, а затем просто используя.Содержит (), какие-либо подсказки в perl?

Комментарии:

1. Ответы хороши. Вы также могли бы рассмотреть возможность простого использования ‘uniq’ во входном файле.

Ответ №1:

В Perl есть ключевые слова defined и exists , которые работают с элементами хэша.

 $hash{'foo'} = 'bar';
print defined $hash{'foo'};      #  prints 1
print exists $hash{'foo'};       #  prints 1
  

Для большинства целей они делают то же самое. Единственное тонкое различие заключается в том, что значение хэша является специальным значением «undefined»:

 $hash{'baz'} = undef;
print defined $hash{'baz'};      # doesn't print 1
print exists $hash{'baz'};       # prints 1
  

Ответ №2:

Вы можете сделать то же самое, используя хэш perl.

 my %seen;
while (my $line = <$filehandle>)
{
  next if ($seen{$line});
  print $line;
  $seen{$line} = 1;
}
  

Комментарии:

1. Вы захотите изменить это next if ($seen{$line}); на next if (exists $seen{$line}); , иначе логически ложные значения, такие как пустая строка или строка «0», никогда не будут напечатаны.

2.@Consp Условие проверяет, является ли значение, связанное с $line , истинным, и все значения в %seen будут строго равны undef или 1. Тем не менее, тело цикла можно было бы сжать до более компактного и идиоматичного print $line unless $seen{$line} ; .

3. Моя ошибка. Каким-то образом я прочитал только две из трех строк цикла и предположил, что вы заполняете хэш строковым содержимым. т. Е. хранилище ключей / значений.