2013-06-13 7 views
-1

У меня есть очень простой вопрос perl относительно проблемы с сопоставлением с образцом. Я читаю файл со списком имен (fileA). Я хотел бы проверить, существует ли какое-либо из этих имен в другом файле (fileB).проверить, существует ли шаблон в файле

if ($name -e $fileB){ 
    do something 
}else{ 
    do something else 
} 

Это способ проверить, существует ли шаблон в файле. Я попытался

open(IN, $controls) or die "Can't open the control file\n"; 
    while(my $line = <IN>){ 
      if ($name =~ $line){ 
        print "$name\tfound\n"; 
      }else{ 
        print "$name\tnotFound\n"; 
      } 
    } 

Это повторяется, как он проверяет и печатает каждую запись, а не проверять, существует ли имя или нет.

+0

'-e' является файловым тестом, он проверяет наличие определенного файла. Это не имеет никакого отношения к содержимому файла. – TLP

+1

, называя это совпадением шаблонов, это вводит в заблуждение, вы точно соответствуете строкам, не так ли? Образец подразумевает, что в игре есть подстановочные знаки или регулярное выражение. – doubleDown

ответ

1

Чтобы проверить, существует ли шаблон в файле, вам необходимо открыть файл и прочитать его содержимое. Самый быстрый способ, как искать для включения двух списков, чтобы сохранить содержимое в хэш:

#!/usr/bin/perl 
use strict; 
use warnings; 

open my $LST, '<', 'fileA' or die "fileA: $!\n"; 
open my $FB, '<', 'fileB' or die "fileB: $!\n"; 

my %hash; 
while (<$FB>) { 
    chomp; 
    undef $hash{$_}; 
} 

while (<$LST>) { 
    chomp; 
    if (exists $hash{$_}) { 
     print "$_ exists in fileB.\n"; 
    } 
} 
0

Я только дал алгоритм вид кода, который не тестировался. Но я чувствую, что эта работа для вас.

my @a; 
my $matched 
my $line; 
open(A,"fileA"); 
open(A,"fileB"); 
while(<A>) 
{ 
    chomp; 
    push @a,$_; 
} 
while(<B>) 
{ 
    chomp; 
    $line=$_; 
    $matched=0; 
    for(@a){if($line=~/$_/){last;$matched=1}} 
    if($matched) 
    { 
     do something 
    } 
    else 
    { 
     do something else 
    } 
} 
+1

Вы делаете двойной цикл, который будет принимать O как долго. –

1

Когда вы делаете сравнивать один список с другим, вы заинтересованы в хэшей. Хэш - это массив с ключом, и сам список не имеет порядка. Хэш может иметь только один экземпляр определенного ключа (но разные ключи могут иметь одни и те же данные).

Что вы можете сделать, это пройти первый файл и создать хэш, введенный этой строкой. Затем вы идете через вторую папку и проверьте, чтобы увидеть, если любой из этих линий соответствует ни ключи в хэш:

#! /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, потому что я не считаю, что гораздо более эффективным и более трудно понять, что происходит.

Смежные вопросы