Когда вы делаете сравнивать один список с другим, вы заинтересованы в хэшей. Хэш - это массив с ключом, и сам список не имеет порядка. Хэш может иметь только один экземпляр определенного ключа (но разные ключи могут иметь одни и те же данные).
Что вы можете сделать, это пройти первый файл и создать хэш, введенный этой строкой. Затем вы идете через вторую папку и проверьте, чтобы увидеть, если любой из этих линий соответствует ни ключи в хэш:
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use autodie; #You don't have to check if "open" fails.
use constant {
FIRST_FILE => 'file1.txt',
SECOND_FILE => 'file2.txt',
};
open my $first_fh, "<", FIRST_FILE;
# Get each line as a hash key
my %line_hash;
while (my $line = <$first_fh>) {
chomp $line;
$line_hash{$line} = 1;
}
close $first_fh;
Теперь каждая строка является ключевым в вашей хэш %line_hash
. Данные действительно не имеют значения. Важной частью является значение самого ключа.
Теперь, когда у меня есть хэш строки в первом файле, я могу прочитать во втором файле и посмотреть, существует ли строка в моей хэша:
open my $second_fh, "<", SECOND_FILE;
while (my $line = <$second_fh>) {
chomp $line;
if (exists $line_hash{$line}) {
say qq(I found "$line" in both files);
}
}
close $second_fh;
Там в map
функция также, что может быть используется:
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use autodie; #You don't have to check if "open" fails.
use constant {
FIRST_FILE => 'file1.txt',
SECOND_FILE => 'file2.txt',
};
open my $first_fh, "<", FIRST_FILE
chomp (my @lines = <$first_fh>);
# Get each line as a hash key
my %line_hash = map { $_ => 1 } @lines;
close $first_fh;
open my $second_fh, "<", SECOND_FILE;
while (my $line = <$second_fh>) {
chomp $line;
if (exists $line_hash{$line}) {
say qq(I found "$line" in both files);
}
}
close $second_fh;
Я не большой поклонник map
, потому что я не считаю, что гораздо более эффективным и более трудно понять, что происходит.
'-e' является файловым тестом, он проверяет наличие определенного файла. Это не имеет никакого отношения к содержимому файла. – TLP
, называя это совпадением шаблонов, это вводит в заблуждение, вы точно соответствуете строкам, не так ли? Образец подразумевает, что в игре есть подстановочные знаки или регулярное выражение. – doubleDown