luni, 9 noiembrie 2015

ATELIER->Perl si bazele de date



#!/usr/bin/perl

use DBI;
#use DBI::mysql;
use POSIX;
use SDBM_File;
use warnings;
use strict;

my @ary = DBI->available_drivers();
# Aceste linii afiseaza driverele disponibile pe sistemul dvs.
print join("\n", @ary), "\n";

my %dbm;
my $db_file = "demo.dbm";
tie %dbm, 'SDBM_File', $db_file, O_RDWR, 0 or die "error open $db_file: $!\n";

my $dbh = DBI->connect('dbi:DBM:');
$dbh->{RaiseError} = 1;

#@driver_names = DBI->available_drivers;
$dbh->disconnect;
print "Content-type: text/html\n\n";

print <<HTML;
<html>
 <head>
  <title>Salut</title>
 </head>
 <body bgcolor="white" text="blue">
  <p>SALUT!</p.
 </body>
<html>
HTML

Resurse:
http://zetcode.com/db/mysqlperl/dbi/

duminică, 8 noiembrie 2015

ATELIER -> Primul grafic plot in Perl

Module pentru grafice in Perl:

Acesta este codul Perl care genereaza graficul test.png.

#!/usr/bin/perl

use PDL::Graphics::PLplot;
use PDL;
my $pl = PDL::Graphics::PLplot->new (DEV =>"png", FILE => "test.png");
my $x = sequence(10);
my $y = $x**2;

$pl->xyplot($x,$y);
$pl->close;


Resurse:
http://plplot.sourceforge.net/
http://search.cpan.org/~dhunt/PDL-Graphics-PLplot/plplot.pd
http://www.slideshare.net/dcmertens/p-lplot-talk
https://github.com/gphat/chart-clicker-examples 

ATELIER -> Extragerea datelor din site-uri HTML cu Perl

Acest script verifica numarul de telefon daca a fost portat pe siteul http://www.portabilitate.ro si afiseaza rezultatele intr-o fereastra terminal dupa cum se vede in imagine.
#!/usr/bin/perl
# Acest script verifica nr 0722270796 la ce retea este abonat
# pe siteul PORTABILITATE.ro
use warnings;
use strict;
# Utilizarea modului LWP::Simple
use LWP::Simple;

my $url = 'http://www.portabilitate.ro/ro-no-0722270796';
my $content = get $url;
die "Nu s-a incarcat $url" unless defined $content;
my @site = head($url);
print $site[1],$site[0], "\n";
if ($content =~ m/Numarul/s) {
 print 'Am gasit linia Numarul';
 #my $_=shift;
#<td style="padding:10px;" align="right"><span id="ctl00_cphBody_lblCurrentOperator">Operator curent:</span></td>
#<td style="color:red;padding:10px; font-weight:bold;"><a id="ctl00_cphBody_lnkOperator">RCS &amp; RDS</a></td>
 #m{<a id="ctl00_cphBody_lnkOperator">\s+</a>(\d+)} || die;
 #return $1;
}else{
 print "Nu am gasit linia";
}
if ($content =~ m/id="ctl00_cphBody_lnkOperator"/s) {
 print 'Am gasit linia Numarul';
}else{
 print "Nu am gasit linia";
} 
my( $m ) = $content =~ m/<a id="ctl00_cphBody_lnkOperator">(.*?)<\/a>/;
print "\n Am gasit Operatorul: $m" if defined $m;
# <span class="ContentTitle">
                # Numarul 0722270796 este portat
            # </span>
my ($nr)= $content =~ m/<span class="ContentTitle">(.*?)<\/span>/s;
print "\n $nr" if defined $nr;
#<a id="ctl00_cphBody_lnkOperatorInitial">VODAFONE ROMANIA</a>
my ($operator)= $content =~ m/<a id="ctl00_cphBody_lnkOperatorInitial">(.*?)<\/a>/;
print "\n Operatorul vechi: $operator";
# my @matches;
# while ($content =~ /Numarul/g) {
 # push @matches, $1;
 
# # }
# foreach my $m(@matches){
 # print $m, "\n";
# }
Resurse:
http://www.perlmonks.org/?node_id=10698
#!/usr/bin/perl

use warnings;
use strict;

use LWP::Simple;

my $url = 'http://www.portabilitate.ro/ro-no-0722270796';
my $content = get $url;
die "Nu s-a incarcat $url" unless defined $content;
my @site = head($url);
print $site[1],$site[0], "\n";
if ($content =~ m/Numarul/s) {
 print 'Am gasit linia Numarul';
 local $_=shift;
#<td style="padding:10px;" align="right"><span id="ctl00_cphBody_lblCurrentOperator">Operator curent:</span></td>
#<td style="color:red;padding:10px; font-weight:bold;"><a id="ctl00_cphBody_lnkOperator">RCS &amp; RDS</a></td>
 m{<a id="ctl00_cphBody_lnkOperator">\s+</a>(\d+)} || die;
 return $1;
}else{
 print "Nu am gasit linia";
}
if ($content =~ m/id="ctl00_cphBody_lnkOperator"/s) {
 print 'Am gasit linia Numarul';
}else{
 print "Nu am gasit linia";
}  

#!/usr/bin/perl -w

use strict;
use LWP::Simple;

my $url = "http://www.wunderground.com/cgi-bin/findweather/getForecast?"
        . "query=";
my $ca = get("${url}95472"); # Sebastopol, California
my $ma = get("${url}02140"); # Cambridge, Massachusetts

my $ca_temp = current_temp($ca);
my $ma_temp = current_temp($ma);
my $diff = $ca_temp - $ma_temp;

print $diff > 0 ? "California" : "Massachusetts";
print " is warmer by ", abs($diff), " degrees F.\n";

sub current_temp {
  local $_ = shift;
  m{<tr ><td>Temperature</td>\s+<td><b>(\d+)} || die "No temp data?";
  return $1;
}


ATELIER -> Expresii regulate in Perl


#!/usr/bin/perl
use warnings;
use strict;
#---EXPRESII REGULATE IN PERL---
# OPERATORUL: =~ cautarea unui sablon intr-un text dat true 
#daca gaseste si false daca nu
if ("Salut Romania" =~ /Salut/){
 print "Am gasit Salut\n";
}else{
 print "Nu am gasit Salut\n";
}
# Daca salut cu s mic
if ("salut Romania" =~ /Salut/){
 print "Am gasit Salut\n";
}else{
 print "Nu am gasit Salut\n";
}
# OPERATORUL: !~ este inversul lui =~
if ("Salut Romania" !~ /Salut/){
 print "Am gasit Salut\n";
}else{
 print "Nu am gasit Salut\n";
} 
# Inlocuirea cuvantului cautat cu o variabila
my $var = "Salut";
if ("Salut Romania" =~ /$var/){
 print "Am gasit Salut\n";
}else{
 print "Nu am gasit Salut\n";
}
my $text = "acestA ESTE UN TEXT
 ce se intinde pe mai multe linii
 dupa cum vedeti";
# ^ desemneaza inceputul de sir, $ desemneaza sfarsitul de sir
# s trateaza sirul ca find stocat pe o singura linie
$text =~ /(^.*a.*$)/s;
print "\"$1\"\n";
# m trateaza sirul ca o singura linie si nu mai citeste alte linii
$text =~ /(^.*a.*$)/m;
print "\"$1\"\n";
# g cauta in sir toate secventele care se potrivesc sablonului.
my $nr = 0;
while ($text =~ /a/g){
 $nr++;
}
print "Am gasit caracterul \'a\' de $nr ori.\n";
#Afiseaza: Am gasit caracterul 'a' de 3 ori.

RESURSE:
http://www.regex.ro/regex-in-perl/

ATELIER -> Perl caracteristici generale

In randurile urmatoare vom incerca sa va prezentam caracteristicile principale ale limbajului:
  • sintaxa - limbajul Perl are o sinataxa case-senzitive, comentariile sunt precedate de caracterul # si fiecare instructiune este terminata cu ; acoladele sunt delimitatori  de bloc de instructiuni {};
  • tipuri de date si variabile
O variabila reprezinta o zona de memorie in care se stocheaza o valoare de un anumit tip, acestei zone i-se asociaza  un nume. Tipurile de date in Perl sunt fie scalare (simple) fie compuse (complexe).

Tipurile de date scalare sunt numerele intregi si cele flotante (9.78) cat si un sir de caractere, iar acestea sunt initializate in cazul numerelor cu valoarea 0 iar in cazul caracterelor cu " " - un sir vid. Exemple:

   $nr_telefon++;
   $pi= 3.14152965;
   $limbaj= "Perl";

Flexibilitatea limbajului Perl permite delimitarea sirurilor si in acest mod:

 q/Mihai Cornel/  #identic cu 'Mihai Cornel'
qq/Mihai Cornel/  #identic cu "Mihai Cornel"
 qx/ls -la/ # executia unei comenzi, identic cu `ls -la`  
qw/Perl Python Java/ # lista de cuvinte

Tipurile complexe de date:
  • tablourile indexate  sunt liste ordonate de scalari, acesibile prin intermediul unui indice numeric. Numele unui vector va fi precedat de caracterul @ iar indicele va porni de la zero.
   @absenti[$nr_studenti] =20;
@linbaje=("Ada", "perl", "Java", "Python");
@mix=("Rosu", 123, $pi, "Radu");

 Pentru accesarea unui element se inlocuieste caracteru @ cu $ pentru ca selectam un singur element: $limbaj[2];

Se poate accesa un subtablou specificand un interval si acesta va fi prefixat cu @;

print "Primele trei limbaje : @limbaje[0..2]\n";

Pentru adaugarea si stergerea de elemente la sfarsitul unui tablou utilizam functiile predefinite push() si pop():

push(@limbaje, "JavaScript");
print "Ultimul limbaj eliminat:", pop(@limbaje);

Daca dorim sa adaugam si sa stergem elemente la inceput utilizam functiile unshift() si shift();

Lungimea unui tablou poate fi aflata cu (ambele constructii au acelasi efect):

$nr_limbaje = @limbaje;
$nr_limbaje = scalar(@limbaje);

Vom obrtine indexul ultimului element:

$nr_limbaje = @#limbaje;

Pentru ca elementele unui tablou sa devina cuvinte ale unui sir de caractere, utilizam constructia:

$sir= "@limbaje";

Elementele tabloului vor fi delimitate de un spatiu. Pentru   aschimba delimitatorul:

$" = "|";
$sir = "@limbaje";
print $sir, "\n";

Tablourile pot fi utilizate si in partea stanga a unei atribuiri;

($primul, $al_doilea)= @limbaje;
($prima, @restul)= @limbaje;

Variabila $primul va primi valoarea primului element al tabloului @limbaje, iar $al_doilea valoarea celui de-al doilea element din tablou. A doua linie, $prima ia valoarea primului element din tablou, iar @restul va fi un tablou continand restul de elemente din tabloul @limbaje.

Atribuirile multiple de variabile scalare se poate face in acest mod:
($oameni, $animale) = ($romani, 123);

Avand acelasi efect cu:
 $oameni = $romani;
$animale = 123;


    • tablouri asociative (hash) - sunt perechi cheie valoare declarate cu caracterul % 

    #!/usr/bin/perl
    use warnings;
    use strict;
    #use utf8;
    #---------------------------------------------------------------------
    # Acesta este un tablou asociativ (hash) format dintr-o cheie si o valoare.
    # Mai jos aveti codurile oraselor din Romania cheia este un nr. iar valoare 
    #este un string. Cheile trebuie sa fie unice.
    #-------------------------------------------------------------------------
    my %codul = (
            1  => 'București',
            30 => 'Suceava',
            31 => 'Botoșani',
            32 => 'Iași',
            33 => 'Neamț',
            34 => 'Bacău',
            35 => 'Vaslui',
            36 => 'Galați',
            37 => 'Vrancea',
            38 => 'Buzău',
            39 => 'Brăila',
            40 => 'Tulcea',
            41 => 'Constanța',
            42 => 'Călărași',
            43 => 'Ialomița',
            44 => 'Prahova',
            45 => 'Dâmbovița',
            46 => 'Giurgiu',
            47 => 'Teleorman',
            48 => 'Argeș',
            49 => 'Olt',
            50 => 'Vâlcea',
            51 => 'Dolj',
            52 => 'Mehedinți',
            53 => 'Gorj',
            54 => 'Hunedoara',
            55 => 'Caraș-Severin',
            56 => 'Timiș',
            57 => 'Arad',
            58 => 'Alba',
            59 => 'Bihor',
            60 => 'Sălaj',
            61 => 'Satu Mare',
            62 => 'Maramureș',
            63 => 'Bistrița-Năsăud',
            64 => 'Cluj',
            65 => 'Mureș',
            66 => 'Harghita',
            67 => 'Covasna',
            68 => 'Brașov',
            69 => 'Sibiu',
            );
    # Aici obtinem valorile pentru chei $codul{23}. Intre acolade sunt specificate 
    #doar numele de chei(aici numere)        
    print "Codul 37 este pentru $codul{37}.\n";
    print "Codul 39 este pentru $codul{39}.\n";
    # Aceste liste pot fi iterate cu ajutorul instructiunii foreach, iar functia each()
    #returneaza o pereche cheie-valoare
    while((my $codul, my $orasul) = each(%codul)){
            print "Codul $codul este pentru $orasul.\n";
    }
    # Adaugarea de elemente se poate face prin
    $codul{70}="Crevedia";
    print "Codul 70 este pentru $codul{70}.\n";
    # Un element se poate sterge cu functia delete(), iar existenta unui element
    #cu exists()
    #if exists ($codul{55}) {
     #       delete($codul{55});
    #}
    print "Codul 55 este pentru $codul{55}.\n";
    # Pentru sortarea unui tablou se utilizeaza sort() iar pentru inversare
    #reverse()
    
       

    sâmbătă, 7 noiembrie 2015

    ATELIER -> Interfata Perl pentru XML

    Modulele xml din CPAN se divid in trei mari categorii:
        1.interfete intre xml si structura de date a Perl;
        2.module care implementeaza o interfata API pentru xml;
        3.module care simplifica lucrul cu xml.
    Desi utilizarea xml cunoaste o mare varietate de formate, marea majoritate a lucrului cu aceste formate se divide in doua mari grupe - extragerea datelor din documentele xml, si crearea de documente xml utilizand date din alte formate.

    Module care asigura interfata de lucru cu xml.
        XML::LibXML; - este utilizat in codul de mai jos
        XML::Feed; -

    Data: Duminica 08:11:2015
    Sa presupunem ca avem fila xml:

    <breakfast_menu>
       <food>
           <name>Belgian Waffles</name>
           <price>$5.95</price>
           <description>Two of our famous Belgian Waffles with plenty of real maple syrup</description>
           <calories>650</calories> </food>
       <food>
           <name>Strawberry Belgian Waffles</name>
           <price>$7.95</price>
           <description>Light Belgian waffles covered with strawberries and whipped cream</description>
           <calories>900</calories> </food>
       <food>
           <name>Berry-Berry Belgian Waffles</name>
           <price>$8.95</price>
           <description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
           <calories>900</calories> </food>
       <food>
           <name>French Toast</name>
           <price>$4.50</price>
           <description>Thick slices made from our homemade sourdough bread</description>
           <calories>600</calories> </food>
       <food>
           <name>Homestyle Breakfast</name>
           <price>$6.95</price>
           <description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
           <calories>950</calories> </food>
    </breakfast_menu>
    

    Urmatoarea fila este scriptul Perl pentru a prelucra acest XML:


    #!/usr/bin/perl
    use warnings;
    use strict;
    # Incarcarea filei pe care dorim sa o prelucram
    my $filename = 'simple.xml';
    print "Numele filei XML de incarcat: $filename.\n";
    # Incarcam in aceast fila modulul XML::LibXML
    use XML::LibXML;
    # Creem un obiect $parser
    my $parser = XML::LibXML->new();
    # Cerem obiectului $parser prin functia parse_file sa parcurga fila xml
    my $doc = $parser->parse_file($filename);
    # Parcurgem elementele si le afisam prin functia print
    foreach my $book($doc->findnodes('/breakfast_menu/food')){
     my ($name) = $book->findnodes('./name');
     my ($price) = $book->findnodes('./price');
     print $name->to_literal," ", $price->to_literal, "\n";
     
    }
    

    Output dupa rularea scriptului Perl:
    Resurse web:
    http://www.perlmonks.org/?node_id=490846

    ATELIER -> Scrierea unei file in Perl


    Scrierea și citirea unei file în Perl

    Operatiunile cu file in Perl sunt:
    1. Open
    2. Read
    3. Write
    4. Close.

    Deschiderea unei file - open()
        open FILE, "filename.txt" or die $!;
    mod
    operator
    creare
    truncate(deletes)
    sterge continutul
    read
    <


    write
    >
    da
    da
    append
    >>
    da

    read/write
    +<


    read/write
    +>
    da
    da
    read/append
    +>>
    da

    Functia open() permite acceptarea a 3 argumente si are forma:
    open FILEHANDLER, MODE, EXPR   


    Urmatoarea linie de cod creaza fila daca nu există, iar daca exista sterge vechiul conținut si adauga continut nou:
        open FILE, ">", "filename.txt" or die $!;
    Acaeasta linie utilizeaza codarea pt literele romanesti, î, ț etc.:
        open FILE, ">:utf8", "libertatea.txt" or die $!;

    Cele trei argumente pot fi combinate ca in urmatorul exemplu:
        open FILE, ">filename.txt" or die $!;

    Citirea filelor

        Daca doriti citirea unei file linie cu linie:
    my @line = <FILE> fila a fost deschisa aceasta va stoca intr-o linie continutul in @line. Daca fila este mai mare aceasta poate fi parcursa linie cu linie:
        while (<File>) {
            print $_;
        }



    Bibliografie:



     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
    #!/usr/bin/perl
    # Pragmas
    use strict;
    use warnings;
    
    =head1 Scrierea filelor in perl
    
    Pentru a scrie o fila in perl este necesara deschiderea acesteia si pentru acesta
    perl ofera functia open().
    
    =cut
    my $numeleFilei = 'report.txt';
    open (my $fm, '>', $numeleFilei) or die "Fila nu sa deschis";
    print $fm "Aceasta este fila $numeleFilei scrisa de Perl open()";
    # Urmatoarea linie de cod va inchide scrierea filei.
    close $fm;
    #Aceasta linie afiseaza in terminal reusita operatiei
    print "Operatia de scriere s-a terminat\n";
    
    =head2
    
    Functia open() are trei parametri: variabila scalar $fm definita chiar in functia open(),
    al doilea parametru este semnul > care indica deschiderea filei pt scriere si al treilea
    parametru este numele filei care va fi scrisa.
    
    Parametrul $fm este pus in functia print() ca prim parametru si aceasta va scrie fila.
    
    =cut
    
    #!/usr/bin/perl
    #    Pragmas
    use strict;
    use warnings;

    =head1 Scrierea filelor in perl

    Pentru a scrie o fila in perl este necesara deschiderea acesteia si pentru acesta
    perl ofera functia open().

    =cut
    my $numeleFilei = 'report.txt';
    open (my $fm, '>', $numeleFilei) or die "Fila nu sa deschis";
    print $fm "Aceasta este fila $numeleFilei scrisa de Perl open()";
    # Urmatoarea linie de cod va inchide scrierea filei.
    close $fm;
    #Aceasta linie afiseaza in terminal reusita operatiei
    print "Operatia de scriere s-a terminat\n";

    =head2

    Functia open() are trei parametri: variabila scalar $fm definita chiar in functia open(),
    al doilea parametru este semnul > care indica deschiderea filei pt scriere si al treilea
    parametru este numele filei care va fi scrisa.

    Parametrul $fm este pus in functia print() ca prim parametru si aceasta va scrie fila.

    =cut

    Resurse:
    http://www.perlfect.com/articles/perlfile.shtml