Archives de catégorie : Perl

[Perl] : le web server en quelques lignes

Après AWK et python, il fallait bien compléter notre petit tour de mise en place d’une socket d’écoute web (web serveur). C’est au tour de Perl de  nous permettre de réaliser cette petite opération.

Ce n’est pas moi qui suit à l’origine de ce code en Perl vous pouvez trouver la source ici.  En tout cas une fois de plus ce n’est pas très long et ça fait le taff en affichant un résultat sur le localhost port 8000.

#!/usr/bin/perl -w
# vim: set sw=4 ts=4 si et:
# Simple single threaded web server, written by Guido Socher
# copyright: freeware, do with it whatever you want. No warranty of any kind.
#
# Usage: perlweb.pl [portnumber] [ip-to-bind-to]
# Example: ./perlweb.pl
# The above example will answer http requests at port 8000 
# on any interface that this machine has.
# Try:
# curl -v http://localhost:8000
#
use strict;
use Socket;
#
my $listenport = $ARGV[0] || 8000;
socket (Server, PF_INET, SOCK_STREAM, 6) || die ("Error socket: $!"); # protocol 6 is tcp
setsockopt(Server, SOL_SOCKET,SO_REUSEADDR,1) || die ("Error setsockopt: $!");
my $sockaddr = sockaddr_in($listenport, $ARGV[1] ? inet_aton($ARGV[1]) : INADDR_ANY) || die ("Error sockaddr_in: $!");
bind(Server,$sockaddr) || die ("Error bind: $!");
listen(Server,SOMAXCONN) || die ("Error listen: $!");

my $caddr;
my $buffer;
while ($caddr = accept(Client, Server)) {
    recv(Client,$buffer,1000,0);
    if ($buffer && $buffer=~/^GET /){
        print Client "HTTP/1.1 200 OK\r\n";
        print Client "Content-Type: text/html\r\n";
        print Client "Server: perlweb/1.0\r\n";
        print Client "Connection: close\r\n";
        print Client "\r\n";
        # debug a bit:
        #print "client:\n$buffer\n";
        print Client "This web server works!\n";
}
close Client; }
# __END__


En plus court pour faire en une ligne mais moins complet :

$ cpan HTTP::Server::Brick   # install dependency
$ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'


[Perl] : récupérer un pattern présent une ou plusieurs fois par ligne

Perl n’est pas forcément mon language préféré mais pour faire du oneline il est plutôt génial.

Aujourd’hui un truc tout simple une fois de plus. Récupérer un pattern par une regex mais en récupérant toutes les occurances. Cela sous entend que l’on récupère également les patterns même si ils sont présents plusieurs fois par ligne.

Voici le fichier de départ :

└─ $ ▶ cat file.txt 
vert gris
jaune
bleu
orange b
rouge blanc beige

Je cherche à récupérer les mots commençant par un b soit le pattern\bb\w+

perl -ne 'while(/\bb\w+/g){print "$&\n";}' file.txt

Donc :

  • -e : ligne de commande
  • -n : évite de faire un while, permet de faire une boucle
  •  while : pour chaque pattern
  • $& : récupère le pattern
  • print : on affiche

[Perl] : passer une simple regex

Perl est super pratique pour fair en une ligne ce que d’autres mettraient plusieurs ligne à faire. En plus Perl se comprend relativement bien je le trouve assez intuitif.

Comment appliquer une regex en Perl et afficher directement le résultat ?

echo "12:30:58" | perl -nle '$_ =~ /(..):(..):(..)/ ; print "Heures:$1\nMinutes:$2\nSecondes:$3"'

Résultat :

Heures:12
Minutes:30
Secondes:58

Donc :

  • $_ : permet de récupérer l’entrée standard
  • =~ / / : permet d’appliquer une regex
  • () : parenthèses capturantes
  • $1 : première parenthèse capturante