Listy Tablice Hashe

Perl FAQ | RecentChanges | Preferences

1. Ile może zajmować pamięci zmienna, tablica, hash?
2. Jak wyrzucić duplikaty z tablicy?
3. Czy w tablicy jest dana wartość?
4. Jak pomieszać tablicę (losowo)?
5. Jak zamienić hash na tablicę i odwrotnie?
6. Czy da się zapisać hash do pliku?
7. Jak pozamieniać teksty według hasha (tłumaczyć)?
8. Czy można posortować hasha (tablicę asocjacyjną)?

1. Ile może zajmować pamięci zmienna, tablica, hash?

W perlu można zużyć całą dostępną pamięć (łącznie z plikiem wymiany), o ile nie ma ograniczeń systemowych.

2. Jak wyrzucić duplikaty z tablicy?

Tworząc hash, którego kluczami są wartości tablicy.

 @a = grep !$x{$_}++, @a;     #lub 
 @a = keys %{ { map { $_, 0 } @a } };  

W drugim przypadku tablica może zmienić kolejność elementów.

3. Czy w tablicy jest dana wartość?

Za pomocą funkcji grep:

 @znalezione = grep {$szukana eq $_} @tablica;

lub robiąc sobie hash z wartościami tablicy (patrz duplikaty w tablicy).

 @hash{@tablica} = (1)x(scalar(@tablica));
 if ($hash{$szukana}) { print "jest\n"; }

4. Jak pomieszać tablicę (losowo)?

 for (1..$#a) { unshift @a,splice(@a,rand($#a),1) }

lub

 while(@a) {push @b, splice(@a,rand(@a),1)}; @a=@b;

5. Jak zamienić hash na tablicę i odwrotnie?

W tablicy kolejne elementy to klucz, wartość, klucz, wartość, itd:

 %hash = @tablica;

Dwie tablice (klucze,wartości):

 @hash{@klucze}=@wartosci;

lub

 %hash = map { ( $klucze[$_] => $wartosci[$_] ) } 0..$#wartosci;

albo pisząc w sposób zrozumiały:

  for (0..$#wartosci) {
    $hash{$klucze[$_]} = $wartosci[$_];
  }

6. Czy da się zapisać hash do pliku?

Ogólnie się nie da, ale można skorzystać z modułów: Storable, Data::Dumper, YAML

7. Jak pozamieniać teksty według hasha (tłumaczyć)?

Należy stworzyć sobie hash (słownik zamian) na przykład polski <-> angielski:

 my %p2a, %a2p,$pol,$ang;

 while(($pol=<>)) {
   chomp $pol;
   $ang = <>;
   chomp $ang;
   $a2p{$ang} = $pol;
   $p2a{$pol} = $ang;
 }

A następnie zamienić:

 $wzorzec = join('|',keys %a2p);	#wykaz slow do zamiany
 $test =~ s/\b($wzorzec)\b/$a2p{$1}/g;  #zamiana

8. Czy można posortować hasha (tablicę asocjacyjną)?

Tablica asocjacyjna z definicji nie może być posortowana, można natomiast stworzyć posortowaną listę kluczy.

Sortowanie według klucza:

 @klucze = sort keys %hash;

lub sortowanie wegług wartości:

 @klucze = sort { $hash{$a} <=> $hash{$b} } keys %hash;

 Uwaga: jeśli wartości są napisami, należy użyć cmp zamiast <=>

sprawdzenie posortowania:

 foreach (@klucze) {print "$_ => $hash{$_}\n";}

Można też przyjrzeć się Tie::IxHash.


Perl FAQ | RecentChanges | Preferences
This page is read-only | View other revisions
Last edited June 19, 2006 8:38 am by kujon.kt.agh.edu.pl (diff)
Search:
Strona znajduje się na serwerze KT AGH.