Парадигма программирования — это совокупность подходов, методов, стратегий, идей и понятий, определяющая стиль написания программ и в современной индустрии программирования очень часто определяется набором инструментов программиста (язык программирования и операционная система).

Парадигма программирования представляет (и определяет) то, как программист видит выполнение программы. Например, в объектно-ориентированном программировании программист рассматривает программу как набор взаимодействующих объектов, тогда как в функциональном программировании программа представляется в виде цепочки вычисления функций.

1) Процедурный стиль

sub max_int {
    my ($x, $y) = @_;
    return $x > $y ? $x : $y;
}
sub max_str {
    my ($x, $y) = @_;
    return $x ge $y ? $x : $y;
}
say max_int( 1, 2 );
say max_str( 'A', 'B' );

2) Объектный стиль: классика

sub Cow::speak {
    say "a Cow goes moooo!";
}
sub Horse::speak {
    say "a Horse goes neigh!";
}
sub Sheep::speak {
    say "a Sheep goes baaaah!";
}
Cow::speak;
Horse::speak;
my @pasture = qw(Cow Cow Horse Sheep Sheep);
foreach $animal (@pasture) {
    $animal->speak;
}

Наследование и полиморфизм:

package Human;
sub new {
    my $class = shift;
    my $self  = {};
    $self->{FULLNAME} = shift;
    bless ($self, $class);
    return $self;
}
sub get_fullname {
    return shift->{FULLNAME};
}
package Woman;
@ISA = qw(Woman);
sub get_fullname {
    my $self = shift;
    return 'Госпожа '.$self->SUPER::get_fullname;
}
package main;
my $woman = new Woman( 'Василиса Петровна' );
say $woman->get_title;

ООП: Moose

Moose — A postmodern object system for Perl 5

package Point;
use Moose; # automatically turns on strict and warnings
has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');
sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}
package Point3D;
use Moose;
extends 'Point';
has 'z' => (is => 'rw', isa => 'Int');
after 'clear' => sub {
    my $self = shift;
    $self->z(0);
};

ООП: Moo

Moo — Minimalist Object Orientation

package Cat::Food;
use Moo;
use Sub::Quote;
 
sub feed_lion {
  my $self = shift;
  my $amount = shift || 1;
 
  $self->pounds( $self->pounds - $amount );
}
has taste => (
  is => 'ro',
);
has brand => (
  is  => 'ro',
  isa => sub {
    die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
  },
);
has pounds => (
  is  => 'rw',
  isa => quote_sub q{ die "$_[0] is too much cat food!" unless $_[0] < 15 },
);

3) Функциональный стиль

Non-blocking HTTP client с помощью IO::Lambda

use IO::Lambda qw(:all);
use IO::Socket;
use HTTP::Request;
sub talk
{
    my $req    = shift;
    my $socket = IO::Socket::INET-> new( PeerAddr => 'www.perl.com', PeerPort => 80);
    lambda {
context $socket;
writable {
   # connected
   print $socket "GET ", $req-> uri, "\r\n\r\n";
   my $buf = '';
   readable {
sysread $socket, $buf, 1024, length($buf) or return $buf;
again; # wait for reading and re-do the block
   }
}
    }
}
...

4) Бесструктурный стиль

perl -MData::Dumper -e 'my$hs;
do { chomp; @a=split/\./,
$_; $hs->{$a[-1]}++; } for
<>; print "$_ $hs->\n"
for sort { $hs-> <=> $hs-> }
keys %$hs'