Как найти и удалить вхождение повторяющегося значения в строку внутри цикла foreach в Perl - PullRequest
0 голосов
/ 16 октября 2018

У меня есть цикл foreach со строкой внутри него:

foreach my $val(sort keys %hash) {

$string = $hash{$val}{'value'};

print "$string\n";

}

Вывод для печати моего $string:

23422
65464
32453
76654
21341
65437
23422
67658

Я хочу найтигде есть два повторяющихся значения, в данном случае '23422', и полностью удалите их из строки.Так что, когда я распечатаю строку, она напечатает:

    65464
    32453
    76654
    21341
    65437
    67658

Однако я не уверен, как это сделать из-за логики внутри цикла foreach.Я попытался проверить, если операторы проверяют наличие равных, а не равных, но это бесполезно, потому что он не определяет значения, чтобы сделать это, находясь внутри цикла foreach.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Выполните передачу для подсчета вхождений каждого значения, затем просмотрите ваш хэш и удалите все записи с количеством их значений больше 1 (это значение появляется в другом месте хэша)

use warnings;
use strict;
use feature 'say';

my @data = qw(23422 65464 32453 76654 21341 65437 23422 67658);

# Make up a hash with above values    
my %h = map { $_ => $data[$_] } 0..$#data;

# Get the count for each value
my %val_cnt;
++$val_cnt{$_} for values %h; 

# Delete hash entries for which the value appears more than once
for (keys %h) {
    delete $h{$_} if $val_cnt{$h{$_}} > 1;

    # Or, to keep %h intact and only print
    # say $h{$_} if $val_cnt{$h{$_}} == 1;
}

say join ' ', values %h;

печатает

76654 67658 32453 65464 21341 65437

См. delete и значения

Если вы предпочитаете хранить хэш и печатать только нужные значения, вместо delete -ingиз хеша просто выведите, для элементов, чье значение равно 1 (закомментированная строка)

0 голосов
/ 16 октября 2018

Вы можете сохранить результат в еще одной хеш-переменной и затем напечатать, если запись уникальна.

Проверьте это:

$hash{100}{'value'}=23422;
$hash{65464}{'value'}=65464;
$hash{32453}{'value'}=32453;
$hash{76654}{'value'}=76654;
$hash{21341}{'value'}=21341;
$hash{65437}{'value'}=65437;
$hash{102}{'value'}=23422;
$hash{67658}{'value'}=67658;

foreach my $val(sort keys %hash) {

$string = $hash{$val}{'value'};

$my_unique{$string}++

}

foreach my $val( keys %my_unique)
{

print "$val\n" if $my_unique{$val} == 1

}

Результаты в оболочке

$ perl -f dup_delete.pl
65437
65464
21341
67658
32453
76654
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...