Ваш код выглядит почти нормально.
Мое предложение только до chomp
каждой строки, перед вами
сохранить элемент в хэше.
Причина в том, что, например, последняя строка не завершена
с \n
может выглядеть так же, как одна из предыдущих строк,
но без chomp
предыдущая строка содержала бы
окончание \n
, тогда как последнее - нет.
Результат состоит в том, что обе эти строки будут различными ключами в хэше.
Сравните мой пример программы (работающей, представленной ниже) с вашей, есть
никаких других существенных отличий, кроме чтения от __DATA__
и
запись в консоль.
В моей программе для демонстрации я поставил 2 варианта распечатки,
один со значениями ключа (количество повторений), а другой - печать только ключей.
В вашей программе оставьте только вторую распечатку.
use strict; use warnings; use feature qw(say);
my %lines;
while(<DATA>) {
chomp;
$lines{$_}++;
}
while(my($key, $val) = each %lines) {
printf "%-32s / %d\n", $key, $val;
}
say '========';
foreach my $key (keys %lines) {
say $key;
}
__DATA__
10/10/2017 00:01:39:000;Sagitter
10/11/2017 00:00:01:002;Lupus
10/12/2017 00:03:14:109;Leon
10/12/2017 00:09:00:459;Sagitter
10/13/2017 01:11:03:009;Lupus
12/13/2017 04:29:00:609;Ariet
10/11/2017 00:00:01:002;Lupus
10/12/2017 00:03:14:109;Leon
Редактировать
Ваш код не присваивает имена $OUTPUT_FILE
и $TMPOUTPUT_FILE
,
Вы даже не объявили эти переменные, но я предполагаю, что в вашем актуальном
код ты это сделал.
Другая деталь заключается в том, что %lines
должен предшествовать my
,
в противном случае при вводе use strict;
компилятор выводит ошибку.
Редактировать 2
Существует более быстрое и короткое решение, чем у вас.
Вместо того, чтобы записывать строки в хеш и печатать их как в
второй шаг, вы можете сделать это в цикле single :
- Читать строку.
- Проверьте, содержит ли хеш уже ключ, равный только что прочитанной строке.
- Если нет, то:
- записать строку в хеш, чтобы заблокировать распечатку, если только
та же самая линия произошла снова,
- печать строки.
Вы даже можете написать эту программу как однострочник Perl:
perl -lne"print if !$lines{$_}++" input.txt
Если вы запустите указанную выше команду из Windows cmd
, она напечатает вывод
на консоль. Если вы используете Linux, вместо двойных кавычек вы можете использовать апострофы.
Конечно, вы можете перенаправить вывод в любой файл, добавив > output.txt
в
вышеуказанная команда.
Код выполняется для каждой входной строки, разбитый на части из-за опции -l
.
Если вам неизвестны какие-либо другие сведения, касающиеся однострочников Perl, поищите в Интернете.