[+] Perl, porównywanie wierszy w tablicach

Potrzebujesz pomocy z C, C++, perl, python, itp.
m_kordi
Posty: 12
Rejestracja: 01 września 2012, 22:41

[+] Perl, porównywanie wierszy w tablicach

Post autor: m_kordi »

Witam!

Mam dwie tablice:
date1:

Kod: Zaznacz cały

13:26:10
13:26:11
13:26:12
13:26:13
13:26:14
date2:

Kod: Zaznacz cały

13:26:07.1
13:26:08.1
13:26:09.1
13:26:10.1
13:26:11.1
13:26:12.1
13:26:13.1
Chciałabym wyciągnąć z tablicy date2 wiersze, które mają taką samą godzinę jak w tablicy date1 i je oczywiście wyświetlić.

Napisałam następujący kod:

Kod: Zaznacz cały

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

my @date1;
my @date2;
open (K, 'plik1.txt'); while (<K>) {
open (P, 'plik2.txt'); while (<P>) {

chomp(@date1 = <K>);
chomp(@date2 = <P>);

 }
}

close(K);
close(P);

my @pasuje;
my @pas;


#my @pasuje;

  foreach (@date1) {
  push @pasuje, grep(/^$_/, @date2);
  print "$_ \n";
  }
  print @pasuje;
Jednakże zostają wyświetlone wszystkie elementy tablicy tab2.

Mam wrażenie, że nic nie jest wstawiane za: Czy ktoś może mi wskazać błąd w moim kodzie?
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Po pierwsze, Twoja dziwna konstrukcja:

Kod: Zaznacz cały

while (<K>){
chomp(@date1 = <K>);
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;
m_kordi
Posty: 12
Rejestracja: 01 września 2012, 22:41

Post autor: m_kordi »

Serdecznie dziękuję za pomoc.

Jednakże:

Kod: Zaznacz cały

 grep (/^$date/, @date2); 
nie uwzględnia faktu, iż w @date2 są godziny podane z kropką, tzn.:

Kod: Zaznacz cały

13:26:07.1

W związku z tym nic nie jest wyświetlane.

Czy jest jakiś sposób, by z tego wybrnąć?
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Pokaż co Ci dokładnie nie działa. U mnie:

Kod: Zaznacz cały

root:/tmp# cat plik1.txt
13:26:10
13:26:11
13:26:12
13:26:13
13:26:14
root:/tmp# cat plik2.txt
13:26:07.1
13:26:08.1
13:26:09.1
13:26:10.1
13:26:11.1
13:26:12.1
13:26:13.1
rooth:/tmp# cat s.pl
#!/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;

Kod: Zaznacz cały

root:/tmp# perl s.pl
13:26:10.1
13:26:11.1
13:26:12.1
13:26:13.1
m_kordi
Posty: 12
Rejestracja: 01 września 2012, 22:41

Post autor: m_kordi »

Wszystko już działa!
Jestem niezmiernie wdzięczna za pomoc.
ODPOWIEDZ