#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. Моя ошибка. Каким-то образом я прочитал только две из трех строк цикла и предположил, что вы заполняете хэш строковым содержимым. т. Е. хранилище ключей / значений.