PerlGtk.pl

  
Menu główne
use PerlMongers::Warszawa;
use PerlMongers::Krakow;
NG_gRadio
Perl Konteksty Grep i Map
  przez wrares (226 odsłon)
Perl Konteksty Grep i Map

Lista jest jedną z najpopularniejszych metod gromadzenia danych. Operatory, które pomagają przetwarzać listy, są powszechnie znane i używane. Przykładem może być tutaj print . Jeszcze innym operatorem jest sort. My natomiast zajmie się dwoma innymi, a mianowicie grep oraz map. Grep pobiera elementy, umieszcza je w zmiennej $_ oraz sprawdza warunek testowy w kontekście skalarnym. Map robi to samo ale umieszcza wyrażenie w kontekście listowym. Na przykładzie postaramy się przedstawić różnice pomiędzy tymi operatorami i ich kontekstami. Założenie dla obu jest takie samo. Załóżmy że mamy miesiąc liczący 31 dni. Załóżmy że niedziele są dniami kończącymi się cyfrą 4 np. 4, 14, 24. Zadanie jest takie Z całego zbioru wyciągniemy tylko niedziele. Wydrukujemy które to są dni oraz ile ich jest . Zobaczymy jak zachowają się wspomniane operatory.
Najpierw ogólne deklaracje
 
################################################
#Program napisany na potrzeby portalu perlgtk.pl
#Programował wrares
#Licencja Perla lub GPL
#2009/03/16
################################################
#!/usr/bin/perl -w

#Deklaracja modułów 
use strict;
use warnings;

#Deklaracja zmiennych oraz zerowanie 
my (@dni, @niedziela, $niedziela) = ();

#Teraz wpiszmy do tablicy wszystkie numery dni z miesiąca operatorem zakresu  
@dni = 1..31;

#Najprostszy sprawdzian funkcją print
print "@dni";  #(1)

##################################################
#Teraz użyjemy funkcji grep do wyciągania numerów dni które
#spełniają kryterium niedzieli
##################################################

@niedziela = grep {
        
     if ($_ =~ /4$/) {
           
        $_;                        
    }
        
} @dni;

print "@niedziela"; #(2)

$niedziela = @niedziela;

print $niedziela; #(3)

#################################
#A teraz zastosujemy funkcję map
#################################

@niedziela = map {
        
     if ($_ =~ /4$/) {
           
        $_;                        
    }
        
} @dni;

print "@niedziela"; #(4)

$niedziela = @niedziela;

print $niedziela; #(5)



Zaznaczyłem wyniki komentarzem #(1) aby było łatwiej zidentyfikować przypadek.

Wydruk (1) generuje
Cytat:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Wydruk (2) i (4) generują ten sam zestaw
Cytat:

4 14 24

i dochodzimy do wydruków (3) i (5) . I mamy tutaj różnicę
Wydruk (3) drukuje
Cytat:

3

natomiast wydruk (5) drukuje
Cytat:

31

Jak pokazano na powyższym przykładzie, brak zasadniczych różnic pomiędzy operatorami map a grep. Sposób zapisu kodu programu oraz dane na których operują są takie same, natomiast uzyskiwane wyniki są różne w zależności od kontekstu. Prawdę powiedziawszy wykorzystując operator map w kontekście skalarnym nie dowiedzielibyśmy się ile jest niedziel. Oczywiście można dołożyć kilka instrukcji i wykorzystując funkcję map otrzymamy rzeczywistą ich ilości, ale czy tędy droga.
Powrót
Szukaj w PerlGtk.pl
The Perl Job site
Szukaj kodu :