Perlいつやるの?今でしょ!

ゆーすけべー先生のPerl入門書がKindle本で出ました。詳細はこちら

Perlについて語ろう
Perlについて語ろう
posted with amazlet at 13.03.17
和田裕介 (2013-03-13)

僕はRuby, PHP, JavaScriptしかまともに触った事が無かったのですが、
心の中からこんな声が聞こえました↓

はいぃぃぃぃ!ということで、Perl入門してみることにしましたです。ちなみにゆーすけべー先生のKindle本には、Perlの基礎文法〜Webアプリの作り方まで、結構広範囲についてサクッと書かれていたのですが、各章の「キリ」がよくて、つまみ食いしながら読み進めることができる感じ。なので自分はまず基礎文法だけやってみたです(細かいところはすっとばして、頻出しそうなところだけつまみ食い)。

※ 以下のコードはKindle本に出てくるサンプルコードとは全く異なり、自分で書いたコードですー
※ ちなみに自分はKindle持ってないので、iphoneのKindleアプリ使って読みますた

配列、ハッシュ

配列、ハッシュの扱い方は色々な方法があるようだけど、自分は以下のように無名リファレンスを使う方法が使いやすかった。javascriptの配列リテラルやオブジェクトリテラルに似ている!

use strict;                                                                                                                                                                                                 
use warnings;

my $users = [                                                                                                                                                                                            
  {id => '001', name => 'hoge', sex => 'man'},
  {id => '002', name => 'fuge', sex => 'woman'}
];

# 要素にアクセス
print $users->[0]->{name}; #hoge

# ループでまわす
foreach my $user (@$users) {
  print $user->{name}; #hogefuge
}

関数

javascriptのように無名関数を引数に渡して、コールバックできるんすね!引数の扱い方がちょっと独特だけど、そのうち慣れるでしょー

use strict;                                                                                                                                                                                                 
use warnings;

sub foo {
  my $callback = shift;
  my $y = 'yyy';

  $callback->($y);
}

# レキシカル変数
my $x = 'xxx';

# 無名関数を関数に渡す
foo(sub {
  my $yy = shift;

  print "$x\n"; # xxx
  print "$yy\n"; # yyy
});

cpan

cpanRubyのgemみたいなもんかな。Kindle本でも紹介されてたAcme::Oppaiというジョークモジュールを使ってみた。Acme::ってのはジョークモジュールにつける名前空間らしい。::で名前空間を繋げて行くあたりはRubyに似てる。ちなみにperlとcpanmの環境設定は、Kindle本の「一歩進んだPerlの環境つくり」という章に書いてあったー

$ cpanm Acme::Oppai
use strict;
use warnings;
use Acme::Oppai;

print Acme::Oppai->oppai;
#  _  ∩
#( ゜∀゜)彡 おっぱい!おっぱい!
# ⊂彡  

OOP

OOPの勉強がてらAcme::Oppaiの拡張的なものを作ってみた。コマンドラインからoppaiコマンドを叩くと、引数によって表示されるAAが変わる代物。

クラス概要


ディレクトリ構成
.
├── Acme/
│   ├── OppaiEx/
│   │   ├── KnightsOfRound.pm
│   │   ├── Kuma.pm
│   │   └── Manager.pm
│   └── OppaiEx.pm
└── oppai*
oppai

コマンドとなるプログラム。こいつに実行権限をつけて、パスを通す

#!/usr/bin/env perl                                                                                                                                                                                         

use strict;
use warnings;
use Acme::Oppai;
use Acme::OppaiEx;

my $key = @ARGV ? shift : '';

my $oppai;
if ($key eq "kuma") {
  $oppai = Acme::OppaiEx::Kuma->new();
} elsif ($key eq "knights") {
  $oppai = Acme::OppaiEx::KnightsOfRound->new();
} else {
  $oppai = Acme::Oppai->new();
}

my $manager = Acme::OppaiEx::Manager->new($oppai);
$manager->show;
Acme/OppaiEx.pm

各パッケージを読み込むプログラム

package Acme::OppaiEx; 

use strict;                                                                                                                                                                                                 
use warnings;
use Acme::OppaiEx::Manager;
use Acme::OppaiEx::Kuma;
use Acme::OppaiEx::KnightsOfRound;

1;
Acme/OppaiEx/Manager.pm

oppaiオブジェクトを管理するパッケージ。oppaiプロパティにoppaiオブジェクトをセットし、showメソッドでそのオブジェクトのoppaiメソッドを呼び出す。

package Acme::OppaiEx::Manager;                                                                                                                                                                             

use strict;
use warnings;

sub new {
  my($class, $oppai) = @_;

  bless {
    oppai => $oppai
  }, $class;
}

sub show {
  my $self = shift;
  print $self->{oppai}->oppai;
}

1;
Acme/OppaiEx/Kuma.pm

クマおっぱいを返すパッケージ

package Acme::OppaiEx::Kuma;                                                                                                                                                                                

use strict;
use warnings;

sub new {
  bless {};
}

sub oppai {
<<'EOS';
      ∩___∩
      | ノ       ヽ (⌒ヽ
     /⌒) ●   ● | / / ミ
  / /   ( _●_)  ミ  /   おっぱい!おっぱい!
 .(  ヽ  |∪|  ` 彡
  \   _ヽノ_  彡
   /  (__ ___/
    |       /
    |  /\ \
    | /    )  )
    ∪    (  \
          \_)
EOS
}

1;
Acme/OppaiEx/KnightsOfRound.pm

円卓の騎士的なおっぱいを返すパッケージ

package Acme::OppaiEx::KnightsOfRound;                                                                                                                                                                      

use strict;
use warnings;

sub new {
  bless {};
}

sub oppai {
<<'EOS';
 \\                                                      //
   \\   お    っ    ぱ    い.                                //
    \\                                                //
      \\                     お    っ    ぱ    い     //
        _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.
      ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡
      (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡
                 _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.
               ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡
               (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.
                |   |     |   |     |   |     |   |    |   |     |   |     |   |
                し ⌒J.    し ⌒J.    し ⌒J.    し ⌒J.   し ⌒J.    し ⌒J.    し ⌒J
EOS
}

1;
実行!
$ oppai

  _  ∩
( ゜∀゜)彡 おっぱい!おっぱい!
 ⊂彡
$ oppai kuma

      ∩___∩
      | ノ       ヽ (⌒ヽ
     /⌒) ●   ● | / / ミ
  / /   ( _●_)  ミ  /   おっぱい!おっぱい!
 .(  ヽ  |∪|  ` 彡
  \   _ヽノ_  彡
   /  (__ ___/
    |       /
    |  /\ \
    | /    )  )
    ∪    (  \
          \_)
$ oppai knights

 \\                                                      //
   \\   お    っ    ぱ    い.                                //
    \\                                                //
      \\                     お    っ    ぱ    い     //
        _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.
      ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡
      (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡
                 _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.     _ _∩.
               ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡  ( ゚∀゚)彡
               (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.   (  ⊂彡.
                |   |     |   |     |   |     |   |    |   |     |   |     |   |
                し ⌒J.    し ⌒J.    し ⌒J.    し ⌒J.   し ⌒J.    し ⌒J.    し ⌒J
できた!

_人人人人人人人人人人人人人人人人人人人人人人_
>まさに、おっぱいのポリモーフィズム多態性)や!<
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

以上

とりあえず基礎文法はざっと入門した!こんどはWebアプリの作り方に入門してみよー