Po pierwsze, Twoja dziwna konstrukcja:
nie spowoduje wczytania całego pliku do
@date1, a wszystkich elementów bez pierwszego - ten już pobrałaś w pierwszej iteracji
while. To samo tyczy się
@date2.
Po drugie, używasz jako domyślnej zmiennej
$_ przetrzymującej aktualny element w pętli
foreach. Dokumentacja funkcji
grep mówi co następuje:
Kod: Zaznacz cały
Evaluates the BLOCK or EXPR for each element of LIST (locally setting $_ to each element)...
Oznacza to ni mniej, ni więcej, że w tej funkcji zmienna
$_ jest nadpisywana przez aktualnie przetwarzany element, ale tej tablicy na której operuje
grep a nie Twojego
foreach. Jeśli Twój kod ma działać, to powinien wyglądać tak:
Kod: Zaznacz cały
#!/usr/bin/perl
use strict;
use warnings;
my @date1;
my @date2;
open (K, 'plik1.txt');
open (P, 'plik2.txt');
chomp(@date1 = <K>);
chomp(@date2 = <P>);
close(K);
close(P);
my @pasuje;
my @pas;
#my @pasuje;
foreach my $d (@date1) {
push @pasuje, grep(/^$d/, @date2);
print "$d \n";
}
print @pasuje;
Natomiast, jeśli miało by to wyglądać jakoś sensownie (tak aby nie narazić nikogo na natychmiastowy odruch wymiotny
proponowałbym taką formę:
Kod: Zaznacz cały
#!/usr/bin/perl
use strict;
use warnings;
my @match;
open 'PLIK1', '<plik1.txt' or die "Nie mozna otworzyc pliku plik1.txt do odczytu: $!";
open 'PLIK2', '<plik2.txt' or die "Nie mozna otworzyc pliku plik2.txt do odczytu: $!";
chomp(my @date1 = <PLIK1>);
chomp(my @date2 = <PLIK2>);
foreach my $date (@date1){
push @match, grep (/^$date/, @date2);
}
print "$_\n" foreach @match;