две вещи:
Всегда chomp, что вы читали в этом включает __DATA__
.:
my @data = <DATA>; # The NL is in each element
chomp @data; # Now it isn't!
Если вы не chomp, вы будете проверять, соответствует ли one
one\n
. Кроме того, поскольку вы помещаете весь __DATA__
на одну строку, он будет считаться одной строкой ввода. Вам нужно будет использовать split, чтобы разделить его на массив.
Вторая вещь: Обычно, когда вы спрашиваете , это в этом ли?t типа вопросов, вы должны сразу подумать о хешах. Хэш может быстро использоваться для поиска элемента. В этом случае, вы бы сделать хэш данных, а затем проверить, если каждый элемент в списке в этом хэша:
#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);
my @list = qw(one two three four five six seven eight nine ten);
my @data = <DATA>;
chomp @data; # Don't forget!
#
# Translate your input as a hash
#
my %data_hash;
for my $element (@data) {
$data_hash{$element} = 1;
}
for my $element (@list) {
if (not exists $data_hash{$element}) {
say "$element isn't in the list";
}
}
__DATA__
eight
two
four
one
two
three
four
seven
eight
ten
one
two
seven
Обратите внимание, что команда map дает вам более короткий способ написания этого цикла:
#
# Translate your input as a hash
#
my %data_hash;
for my $element (@data) {
$data_hash{$element} = 1;
}
Теперь может быть сокращен до одной строки:
#
# Translate your input as a hash
#
my %data_hash = map { $_ => 1 } @data;
Это обычный способ превратить массив в хэш, поэтому большинство разработчиков просто использовать его.
Было бы использовать хэш для слов в '@ data', поэтому вы можете просто проверить, существует ли' $ mat' в хэше или нет. –