Привет, у меня есть эти строки и несколько других строк в массиве.

    revised_1.4_1.4-1.05-jan
    revised_1.5_1.8-before
    revised_1.5_1.8-after
    revised_1.5_0.7-mid
    deleted&reviewed_0.9-0.8-1.05-jan
    deleted&reviewed_1.6_1.6-before
    deleted&reviewed_0.5_1.8-after
    deleted&uploaded_0.8_1.9-midweek
    deleted&uploaded_1.0_1.3-offweek
    accessedbeforesecondquarter_0.8._1.6-jan
    accessedbeforesecondquarter_0.9_1.7-feb

Мне нужно сохранить в массиве одну из почти похожих строк. Как я могу кодировать, чтобы получить этот массив?

    revised_1.4_1.4-1.05-jan 
    deleted&reviewed_0.9-0.8-1.05-jan
    deleted&uploaded_0.8_1.9-midweek
    accessedbeforesecondquarter_0.8._1.6-jan

Вот мой код, и мне кажется, что мне не удается сохранить строки в массиве.

my %seen;
my @strings = grep !$seen{ substr($_,0,2) }++, @strings;
0
Xpx 19 Май 2015 в 05:19

1 ответ

Лучший ответ

Сохраняя дух того, что вы пробовали:

my %seen;
my @result = grep {! $seen{(split "_",$_)[0]}++} <DATA>;
print @result;

__DATA__
revised_1.4_1.4-1.05-jan
revised_1.5_1.8-before
revised_1.5_1.8-after
revised_1.5_0.7-mid
deleted&reviewed_0.9-0.8-1.05-jan
deleted&reviewed_1.6_1.6-before
deleted&reviewed_0.5_1.8-after
deleted&uploaded_0.8_1.9-midweek
deleted&uploaded_1.0_1.3-offweek
accessedbeforesecondquarter_0.8._1.6-jan
accessedbeforesecondquarter_0.9_1.7-feb

Результат:

revised_1.4_1.4-1.05-jan
deleted&reviewed_0.9-0.8-1.05-jan
deleted&uploaded_0.8_1.9-midweek
accessedbeforesecondquarter_0.8._1.6-jan
1
salparadise 19 Май 2015 в 06:26
Вы можете объяснить (split "_",$_)[0]}++ этот код. Я использовал оператор декремента вместо ++, это тоже работает. Что означает оператор ++ в вашем коде?
 – 
user4284509
19 Май 2015 в 08:26
2
(split "_", $_) возвращает список, разделенный с помощью '_' с [0], вы берете первый элемент списка, а затем увеличиваете счетчик для хеша. Любое ненулевое число истинно в Perl в логическом контексте. Итак, '!1' или '!-1' возвращает false. grep возвращает истинные элементы.
 – 
xtreak
19 Май 2015 в 08:35