SlideShare a Scribd company logo
1 of 144
Download to read offline
My Four
Preferences
My Four
  Preferences
in my Perl Web practice
Architecture and music
Danube
My Four
  Preferences
in my Perl Web practice
1. Parsing URLs with grammar
2. .ini configuration files
3. WWW::Page
4. XSLT
0.
Perl 5.10
1.
Parsing URLs with grammar
URL is . . .
URL is . . .
a string
URL is . . .
a string,
a set of parts
URL is . . .
a string,
a set of parts,
a container of parameters
Blog URL scheme
Blog URL scheme
/
Blog URL scheme
/
/message‐uri/
Blog URL scheme
/
/message‐uri/
/tag/tag‐name/
Blog URL scheme
/
/message‐uri/
/tag/tag‐name/
/post/
Blog URL scheme
/
/message‐uri/
/tag/tag‐name/
/post/
/message‐uri/post/
Blog URL scheme
/
/message‐uri/
/tag/tag‐name/
/post/
/message‐uri/post/
/message‐uri/comments/
How to parse?
How to parse?
RewriteRules in .htaccess
How to parse?
RewriteRules in .htaccess
^$ /index.pl?page=home
How to parse?
RewriteRules in .htaccess
^$ /index.pl?page=home
^post/?$ /post.pl
How to parse?
RewriteRules in .htaccess
^$ /index.pl?page=home
^post/?$ /post.pl
^([^/]+)/? /index.pl?page=$1
How to parse?
RewriteRules in .htaccess
^$ /index.pl?page=home
^post/?$ /post.pl
^([^/]+)/? /index.pl?page=$1
etc.
How to parse?
RewriteRules in .htaccess

Bad: involves programming
outside Perl
How to parse?
Regular expressions
How to parse?
Regular expressions
given ($uri) {
   when (/^/$/) {...}
}
How to parse?
Regular expressions
given ($uri) {
   when (/^/$/) {...}
   when (/^/post/?/) {...}
}
How to parse?
Regular expressions
given ($uri) {
   when (/^/$/) {...}
   when (/^/post/?/) {...}
   # (regexes as in .htaccess)
}
How to parse?
Regular expressions

Bad: rules are not obvious
How to parse?
split builtin
How to parse?
split builtin
@parts = split m{/}, $uri;
given (scalar @parts) {
   when (1) {...}
   when (2) {...}
}
How to parse?
split builtin

Bad: boring
How to parse?
Grammars
How to parse?
Grammars

Cool!
How to parse?
Grammars

Cool!
Easy to maintain
How to parse?
Grammars

Cool!
Easy to maintain
But might be slow
How to parse?
Grammars

Cool!
Easy to maintain
But might be slow . . .
up to 100 times over regexes.
Gramars

Parse::RecDescent
today

Perl 6 grammars
tomorrow
Gramars

Parse::RecDescent
today

Perl 6 grammars
after Christmas
uri          : post EOL
             | view EOL
uri          : post EOL
             | view EOL
post         : post‐message
             | post‐comment
uri          : post EOL
             | view EOL
post         : post‐message
             | post‐comment
view         : view‐message
             | view‐tag
uri          : post EOL
             | view EOL
post         : post‐message
             | post‐comment
view         : view‐message
             | view‐tag
view‐message : ‘/’ word ‘/’
uri          : post EOL
             | view EOL
post         : post‐message
             | post‐comment
view         : view‐message
             | view‐tag
view‐message : ‘/’ word ‘/’
view‐tag     : ‘/tag/’ word ‘/’
uri          : post EOL
             | view EOL
post         : post‐message
             | post‐comment
view         : view‐message
             | view‐tag
view‐message : ‘/’ word ‘/’
view‐tag     : ‘/tag/’ word ‘/’
word         : /w+/
uri          : post EOL
             | view EOL
post         : post‐message
             | post‐comment
view         : view‐message
             | view‐tag
view‐message : ‘/’ word ‘/’
view‐tag     : ‘/tag/’ word ‘/’
word         : /w+/
post‐message : ‘/post/’
uri          : post EOL
             | view EOL
post         : post‐message
             | post‐comment
view         : view‐message
             | view‐tag
view‐message : ‘/’ word ‘/’
view‐tag     : ‘/tag/’ word ‘/’
word         : /w+/
post‐message : ‘/post/’
post‐comment : view‐message ‘/post/’
Actions in grammars
uri : post EOL
    | view EOL
uri : post EOL {
         $action = ‘post’;
      }
    | view EOL
uri : post EOL {
         $action = ‘post’;
      }
    | view EOL {
         $action = ‘view’;
      }
view‐message : ‘/’ word ‘/’
view‐tag     : ‘/tag/’ word ‘/’
view‐message : ‘/’ word ‘/’ {
                  $msg_sid = $item{word};
               }
view‐tag     : ‘/tag/’ word ‘/’
view‐message : ‘/’ word ‘/’ {
                  $msg_sid = $item{word};
               }
view‐tag     : ‘/tag/’ word ‘/’ {
                  $action = ‘view‐tag’;
                  $tag = $item{word};
               }
http://example.com/twincity/


$action = ‘view’;
$msg_sid = ‘twincity’;
http://example.com/twincity/


$action = ‘view’;
$msg_sid = ‘twincity’;



http://example.com/tag/workshop/


$action = ‘view‐tag’;
$tag = ‘workshop’;
my %uri = (
    '/'              => {
                       'type' => 'index',
                     },
    '/alpha/'        => {
                       'type' => 'section',
                       'sectionUri' => 'alpha',
                       'sectionPage' => 1,
                     },
    '/beta‐2/34/14/' => {
                       'type' => 'message',
                       'sectionUri' => 'beta',
                       'sectionPage' => 2,
                       'threadID' => 34,
                       'threadPage' => 1,
                       'messageID' => 14,
                     },
    '/‐/'            => {
                       'type' => '404',
                     });
for $uri (keys %uri) {    
    $parser‐>parse($uri);


    cmp_deeply(
        $parser‐>{data},
        $uri{$uri},
        $uri
    );
}
Grammars are

logical
Grammars are

logical,

easy to extend
Grammars are

logical,

easy to extend,

cacheable
Grammars are

logical,

easy to extend,

cacheable,

easy to test
2.
.ini configuration files
Application =
code + configuration
Example: blog


number of messages per page
#!/usr/bin/perl
my $MSG_PER_PAGE = 10;
#!/usr/bin/perl
my $MSG_PER_PAGE = 10;
Load configuration
from external file
Load configuration
from external non-Perl file
<config>
   <page_length>10</page_length>
</config>
Question:
   XML
    or
  JSON
    or
  YAML
    ?
Answer:
Windows INI
[page]
length=10
[section]
page_length=10


[thread]
page_length=10


[obsene]
replacement=***


[preview]
last_posts=31
last_message_length=200
global.ini   local.ini
global.ini    local.ini

[page]
length=10


[db]          [db]
host=db.int   host=localhost
port=3333     port=3306
use Config::INI::Access;


config‐>load(quot;conf/config.iniquot;);
use Config::INI::Access;


config‐>load(quot;conf/config.iniquot;);
config‐>load(quot;conf/local.iniquot;);
use Config::INI::Access;


config‐>load(quot;conf/config.iniquot;);
config‐>load(quot;conf/local.iniquot;);


say config‐>db‐>host;
[db]
host=localhost
port=3306



say config‐>db‐>host;
3.
WWW::Page
WWW::Page
is a kinda MVC
http://example.com/some/page
http://example.com/some/page


/www/example.com/some/page/index.xml
http://example.com/some/page


/www/example.com/some/page/index.xml


              XML
http://example.com/some/page


/www/example.com/some/page/index.xml


               XML
        Perl
               XML
http://example.com/some/page


/www/example.com/some/page/index.xml


               XML
        Perl
               XML
        XSLT
               HTML
http://example.com/some/page


/www/example.com/some/page/index.xml


                XML
        Perl
                XML
        XSLT
                HTML


               Browser
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
    use WWW::Page;
    use encoding 'utf‐8';


    my $page = new WWW::Page ({
        'xslt‐root'       => quot;../data/xslquot;,
    });


    print $page‐>as_string();
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
            sub Import::Client::keywordList
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
   package Import::Client;

   sub keywordList
   {
       my ($this, $page, $node, $args) = @_;
   
       my $sth = $dbh‐>prepare(
           quot;select keyword, uri from keywordsquot;);
       $sth‐>execute();
       while (my ($keyword, $uri) = $sth‐>fetchrow_array())
       {
           my $item = 
               $page‐>{'xml'}‐>createElement ('item');
           $item‐>appendText($keyword);
           $item‐>setAttribute('uri', $uri);
           $node‐>appendChild($item);
       }
   
       return $node;
   }
   package Import::Client;

   sub keywordList
   {
       my ($this, $page, $node, $args) = @_;
   
       my $sth = $dbh‐>prepare(
           quot;select keyword, uri from keywordsquot;);
       $sth‐>execute();
       while (my ($keyword, $uri) = $sth‐>fetchrow_array())
       {
           my $item = 
               $page‐>{'xml'}‐>createElement ('item');
           $item‐>appendText($keyword);
           $item‐>setAttribute('uri', $uri);
           $node‐>appendChild($item);
       }
   
       return $node;
   }
   package Import::Client;

   sub keywordList
   {
       my ($this, $page, $node, $args) = @_;
   
       my $sth = $dbh‐>prepare(
           quot;select keyword, uri from keywordsquot;);
       $sth‐>execute();
       while (my ($keyword, $uri) = $sth‐>fetchrow_array())
       {
           my $item = 
               $page‐>{'xml'}‐>createElement ('item');
           $item‐>appendText($keyword);
           $item‐>setAttribute('uri', $uri);
           $node‐>appendChild($item);
       }
   
       return $node;
   }
   package Import::Client;

   sub keywordList
   {
       my ($this, $page, $node, $args) = @_;
   
       my $sth = $dbh‐>prepare(
           quot;select keyword, uri from keywordsquot;);
       $sth‐>execute();
       while (my ($keyword, $uri) = $sth‐>fetchrow_array())
       {
           my $item = 
               $page‐>{'xml'}‐>createElement ('item');
           $item‐>appendText($keyword);
           $item‐>setAttribute('uri', $uri);
           $node‐>appendChild($item);
       }
   
       return $node;
   }
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
<keyword‐list>
    <item uri=quot;http://perl.org/quot;>Perl</item>
    <item uri=quot;http://dev.perl.org/quot;>Perl 6</item>
    <item uri=quot;http://bbc.co.uk/quot;>Perl on rails</item>
</keyword‐list>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <keyword‐list> . . . </keyword‐list>
        </manifest>
    
        <content>
            <month‐calendar> . . . </month‐calendar>
        </content>
    </page>
XML
XSLT
        HTML


       Browser
Possible improvements
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <page:keyword‐list remote=quot;host2quot;>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <page:keyword‐list remote=quot;host2quot;>
        </manifest>
    
        <content>
            <page:month‐calendar cache=quot;memcachedquot;/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <page:keyword‐list remote=quot;host2quot;>
        </manifest>
    
        <content>
            <page:month‐calendar cache=quot;xmlquot;/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <page:keyword‐list remote=quot;host2quot;>
        </manifest>
    
        <content>
            <page:month‐calendar transform=quot;other.xslquot;/>
        </content>
    </page>
4.
XSLT
Not .WHAT XSLT is
but .WHY I use it
4a.
XSLT: divide and power
website =
 logic    +   layout
website =
Perl-code +   HTML
website =
Perl-code +   XML+XSLT
website =
Perl-code +       XML+XSLT


Perl programmer    XSLT coder
website =
Perl-code +       XML+XSLT


Perl programmer    XSLT coder
4b.
XSLT: multiple languages
en.xml 


<strings>
    <months>
       <item>January</item>
       <item>February</item>
          . . .
       <item>December</item>
    </months>
</strings>
de.xml 


<strings>
    <months>
       <item>Januar</item>
       <item>Februar</item>
          . . .
       <item>Dezember</item>
    </months>
</strings>
at.xml 


<strings>
    <months>
       <item>Jänner</item>
       <item>Februar</item>
          . . .
       <item>Dezember</item>
    </months>
</strings>
<xsl:variable name=quot;strquot;>
    <xsl:copy‐of select=quot;
       document(
          concat($lang, ‘.xml’)
       )quot;/>
</xsl:variable>
<xsl:variable name=quot;strquot;>
    <xsl:copy‐of select=quot;
       document(
          concat($lang, ‘.xml’)
       )/stringsquot;/>
</xsl:variable>
<date day=quot;7quot; month=quot;11quot; year=quot;2008quot;/>
<date day=quot;7quot; month=quot;11quot; year=quot;2008quot;/>




<xsl:value‐of select=quot;@dayquot;/>
<date day=quot;7quot; month=quot;11quot; year=quot;2008quot;/>




<xsl:value‐of select=quot;@yearquot;/>
<date day=quot;7quot; month=quot;11quot; year=quot;2008quot;/>




<xsl:value‐of 
    select=quot;$str/months/item[@month]quot;/>
4b.
XSLT: multiple layouts
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;pda/view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;iphone/view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
    <?xml version=quot;1.0quot; encoding=quot;UTF‐8quot;?>
    <page
        import=quot;Import::Clientquot;
        transform=quot;rss/view.xslquot;
        xmlns:page=quot;urn:www‐pagequot;>
    
        <manifest>
            <title>WWW::Page Web‐Site</title>
            <locale>en‐gb</locale>
            <page:keyword‐list/>
        </manifest>
    
        <content>
            <page:month‐calendar/>
        </content>
    </page>
website =
Perl-code +       XML+XSLT


Perl programmer    XSLT coder
website =
Perl-code +       XML+XSLT


Perl programmer    XSLT coder
                   XSLT coder
                   XSLT coder
                   XSLT coder
__END__

Andrew Shitov

http://andy.sh | mail@andy.sh

More Related Content

Viewers also liked

Mulheres!!!
Mulheres!!!Mulheres!!!
Mulheres!!!
edubh1
 
3. día del idioma
3. día del idioma3. día del idioma
3. día del idioma
garfredy
 
Estudantes ERASMUS da UM
Estudantes ERASMUS da UMEstudantes ERASMUS da UM
Estudantes ERASMUS da UM
espectro cego
 
3853996 andre-luiz-evolucao-em-dois-mundos
3853996 andre-luiz-evolucao-em-dois-mundos3853996 andre-luiz-evolucao-em-dois-mundos
3853996 andre-luiz-evolucao-em-dois-mundos
Ricardo Costa e silva
 
F16-T Brochure_email_v11 (1)
F16-T Brochure_email_v11 (1)F16-T Brochure_email_v11 (1)
F16-T Brochure_email_v11 (1)
Jaime Alboim
 
316de2d7316e440b9fe35064b3bfc720
316de2d7316e440b9fe35064b3bfc720316de2d7316e440b9fe35064b3bfc720
316de2d7316e440b9fe35064b3bfc720
Ramayan Chauhan
 
H Howser reference letter
H Howser reference letterH Howser reference letter
H Howser reference letter
Heather Howser
 
Кратко о Rakudo
Кратко о RakudoКратко о Rakudo
Кратко о Rakudo
Andrew Shitov
 
HeraNet - edukacija o EU fondovima
HeraNet - edukacija o EU fondovimaHeraNet - edukacija o EU fondovima
HeraNet - edukacija o EU fondovima
Ekonomski portal
 

Viewers also liked (18)

Mulheres!!!
Mulheres!!!Mulheres!!!
Mulheres!!!
 
IMG
IMGIMG
IMG
 
pirates & scalpels
pirates & scalpelspirates & scalpels
pirates & scalpels
 
Dynargie-Scan
Dynargie-ScanDynargie-Scan
Dynargie-Scan
 
3. día del idioma
3. día del idioma3. día del idioma
3. día del idioma
 
Estudantes ERASMUS da UM
Estudantes ERASMUS da UMEstudantes ERASMUS da UM
Estudantes ERASMUS da UM
 
3853996 andre-luiz-evolucao-em-dois-mundos
3853996 andre-luiz-evolucao-em-dois-mundos3853996 andre-luiz-evolucao-em-dois-mundos
3853996 andre-luiz-evolucao-em-dois-mundos
 
Exam Norm.
Exam Norm.Exam Norm.
Exam Norm.
 
Marat
MaratMarat
Marat
 
Africa
AfricaAfrica
Africa
 
F16-T Brochure_email_v11 (1)
F16-T Brochure_email_v11 (1)F16-T Brochure_email_v11 (1)
F16-T Brochure_email_v11 (1)
 
316de2d7316e440b9fe35064b3bfc720
316de2d7316e440b9fe35064b3bfc720316de2d7316e440b9fe35064b3bfc720
316de2d7316e440b9fe35064b3bfc720
 
H Howser reference letter
H Howser reference letterH Howser reference letter
H Howser reference letter
 
Кратко о Rakudo
Кратко о RakudoКратко о Rakudo
Кратко о Rakudo
 
HeraNet - edukacija o EU fondovima
HeraNet - edukacija o EU fondovimaHeraNet - edukacija o EU fondovima
HeraNet - edukacija o EU fondovima
 
Öppna data: Vad har vi gjort på Riksantikvarieämbetet?
Öppna data: Vad har vi gjort på Riksantikvarieämbetet? Öppna data: Vad har vi gjort på Riksantikvarieämbetet?
Öppna data: Vad har vi gjort på Riksantikvarieämbetet?
 
Tim waters openhistoricalmap geomob london july 2015
Tim waters openhistoricalmap geomob london july 2015Tim waters openhistoricalmap geomob london july 2015
Tim waters openhistoricalmap geomob london july 2015
 
LVV - Clínica Centrada no Cotidiano - Monog Esp Saúde Mental (FASI) 2008
LVV - Clínica Centrada no Cotidiano - Monog Esp Saúde Mental (FASI) 2008LVV - Clínica Centrada no Cotidiano - Monog Esp Saúde Mental (FASI) 2008
LVV - Clínica Centrada no Cotidiano - Monog Esp Saúde Mental (FASI) 2008
 

More from Andrew Shitov

The Joy of Smartmatch
The Joy of SmartmatchThe Joy of Smartmatch
The Joy of Smartmatch
Andrew Shitov
 

More from Andrew Shitov (20)

Perl6 one-liners
Perl6 one-linersPerl6 one-liners
Perl6 one-liners
 
Creating a compiler in Perl 6
Creating a compiler in Perl 6Creating a compiler in Perl 6
Creating a compiler in Perl 6
 
Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)Fun with Raspberry PI (and Perl)
Fun with Raspberry PI (and Perl)
 
Perl6 in-production
Perl6 in-productionPerl6 in-production
Perl6 in-production
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6
 
AllPerlBooks.com
AllPerlBooks.comAllPerlBooks.com
AllPerlBooks.com
 
Perl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel ComputingPerl 6 for Concurrency and Parallel Computing
Perl 6 for Concurrency and Parallel Computing
 
The Joy of Smartmatch
The Joy of SmartmatchThe Joy of Smartmatch
The Joy of Smartmatch
 
YAPC::Europe 2013
YAPC::Europe 2013YAPC::Europe 2013
YAPC::Europe 2013
 
Perl 7, the story of
Perl 7, the story ofPerl 7, the story of
Perl 7, the story of
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массив
 
What's new in Perl 5.14
What's new in Perl 5.14What's new in Perl 5.14
What's new in Perl 5.14
 
Что нового в Perl 5.14
Что нового в Perl 5.14Что нового в Perl 5.14
Что нового в Perl 5.14
 
Perl6 grammars
Perl6 grammarsPerl6 grammars
Perl6 grammars
 
Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6Text in search queries with examples in Perl 6
Text in search queries with examples in Perl 6
 
There's more than one way to empty it
There's more than one way to empty itThere's more than one way to empty it
There's more than one way to empty it
 
Perl 6 by example
Perl 6 by examplePerl 6 by example
Perl 6 by example
 
How to clean an array
How to clean an arrayHow to clean an array
How to clean an array
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 

My four preferences in Perl Web practices