vineri, 13 octombrie 2017

Articole de pe perltrick.com

What's new on CPAN - September 2017
Mock APIs for free using JSON Schemas
What's new on CPAN - August 2017
Plotting With Perl 6
Git bisect and Perl
What's new on CPAN - July 2017
Pretty Printing Perl 6
What's new on CPAN - June 2017
What's New on CPAN - Annual Edition
What's new on CPAN - May 2017
On Sigils
What's new on CPAN - April 2017
Getting started with XS
Thinking about Perl 6
What's new on CPAN - March 2017
AWS Cloudfront cache invalidation with Paws
Track Module Changes While You Sleep
What's new on CPAN - February 2017
Deploy a static website with AWS S3 and Paws
What's new on CPAN - January 2017
Six more things I like about 6
Laptop review: Dell XPS 13 2-in-1 (9365)
What's new on CPAN - December 2016
Obscure Perl trick: single-quote separators
Perl module names are filepaths - and that's all
What's new on CPAN - November 2016
How to build a base module
I'm speaking at the London Perl Workshop 2016
How to upload a script to CPAN
What's new on CPAN - October 2016

Articole de pe: blogs.perl.org — blogging the onion

ARTICOLE:

Announcing meta::hack v2
I'm wondering how to learn good perl
Perl 5 Porters Mailing List Summary: October 2nd-9th
Docker based Continuous Integration for perl projects
Dancer 2017 Survey: Update
Perl 6 at the London Perl Workshop - 25 Nov 2017
Fancy a Game of (Code) Golf?
Machine learning in Perl, Part3: Deep Convolutional Generative Adversarial network
Iridium Flare End-Of-Life
CPAN6 Is Here
Rakudo.js update - passes 64.65% roast test
Perl less buggy than Python?
Strawberry Perl 5.26.1.1 and 5.24.3.1 released
Call for Lightning Talks -- London Perl Workshop
Perl 5 Porters Mailing List Summary: September 25th - October 1st
Dancer Survey 2017
How to do Bit Operation Correctly in Perl? One Answer is SPVM.
Not-Perl: Career Advice for Programmers
YAML::PP Grant Report August/September 2017
6lang: The Naming Discussion Update

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()