Perl

モジュールの読み込み


#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Data::Dumper;
use lib qw(lib /home/llll/lib /home/llll/local/lib/perl5);
use Template;

Perl プラグマ

スクリプトの安全性を高める Perl プラグマ


#!/usr/bin/perl

use strict;
use warnings;

use strict

宣言されていないグローバル変数を制限する。

use warnings

警告レベルを最大にする。

初期化されていない変数の使用を制限する。

use constant

定数を定義する。

定数WORDに文字列を与える。(定数は全て大文字で命名)


use constant WORD => 'けいね';

連想配列のようにリストで宣言することも可能。


use constant {
  NAME => 'もこ',
  TITLE => 'たん',
  KEYWORDS => 'インしたお',
};

定数の呼び出し。

$, @ のようなものは必要ない。


print NAME. TITLE. KEYWORDS. '!';

コメントアウト

1行のコメントアウト

#(シャープ記号)後の文章は1行分コメントアウトされる


# コードして認識されない文字列
# 各機能の説明に利用する
print aa; # コードと同じ行にも記述可能

複数行のコメントアウト


=pod
コメント
コメント
コメント

=cut

変数

変数の宣言

グローバル変数は変数の前にourを付けて宣言する。

ローカル変数は変数の前にmyを付けて宣言する。

宣言がない場合は自動的にグローバル変数となるが、use strict下ではエラーとなる。

グローバル変数はどこでも呼び出せる反面どこでも値を変更できてしまう危険があるので、基本的にはローカル変数を使うようにする。


our $GROVAL_STR = "東方"; # グローバル変数
my $marisa = "まりさ"; # ローカル変数
sub alice{
  print $marisa; # サブルーチンの外のローカル変数は呼び出せない
  
  print $GROVAL_STR; # グローバル変数は呼び出せる。
}

数値・文字列

数値も文字列もスカラー変数という形で値を格納する


my $i = 9; # 数値
my $str = "鈍痛"; # 文字列は "" で囲む。

for (my $j=0;$j<$i;$j++){
  print $str;
}
# $i回、$strの出力が繰り返される
# 鈍痛鈍痛鈍痛鈍痛鈍痛鈍痛鈍痛鈍痛鈍痛

配列


@array = (
  "フランス",
  "オランダ",
  "チベット"
);


print $array[2];
print $#array;

ハッシュ(連想配列)


%hash = (
  id => 1,
  name => "にとり",
  skill => "水を操る程度の能力",
  kind => "河童",
);
print $hash->{'skill'};

定数

一度宣言後、一切の変更・代入を許さない値を定数と呼びます。

constantプラグマを使う


Constant.pm
package Constant;

use constant INT=> 1;

use Constant;

print Constant INT => 7;
print Constant STR => "文字文字";

ヒアドキュメント

複数行の文字列を扱う


my $str = <<EOM;
あいつは大変なものを盗んでいきました
あなたの心です
はいっ!
EOM

文字列関数


my $str = "aaa:bbb:ccc:ddd:eee";
my @array = split(":", $str); # 文字列の分割

# 以下の配列と同じ意味

@array = (
  "aaa",
  "bbb",
  "ccc",
  "sss",
  "eee"
);

文字列整形

sprintf


  my $update = sprintf("%04d %02d %02d", $year, $mon, $mday);

配列関数

配列要素の追加と削除


push (@array, $line); # 末尾に追加
pop (@array, $line); # 末尾を削除
unshift (@array, $line); # 先頭に追加
shift (@array, $line); # 先頭を削除
splice (@array, $n, $m); # $n番目から$m個削除

配列要素の置換


splice (@array, $n, $m, @new_array); # $n番目から$m個置換

配列要素の並び替え


reverse @array; # 配列を逆順に

my @array = (
  "aaa",
  "bbb",
  "ccc",
  "sss",
  "eee"
);

配列要素の結合


my $str = join(":", @array);

配列要素の並び替え

$str = "aaa:bbb:ccc:ddd:eee";

配列要素内の繰り返し


foreach my $line(@lines){
  print $line;
}

ファイルの入出力

open関数は安全なコードにするため、引数は3項にする。

ファイルハンドルはmy宣言で変数にする。

ファイル読み込みに失敗したときのため、die関数を付与する。


my $file = 'dir/file.txt';
open(my $fh, '>', $file) or die "die $!";
my @csv = <$fh>;
close($fh);

時刻関数

time()で現在の時間を得る

time()は1900年からの秒数を得るため、localtime()で日時要素の配列にする

年は1900年からの値なので、1900を足す

月は0から数えるので、1を足す

曜日は0~6の数字で与えられるので、配列に対応させ文字列にする

time()は1900年からの秒数を得るため、localtime()で日時要素の配列にする


  my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
  $year += 1900;
  $mon += 1;
  @weaks = ('日','月','火','水','木','金','土',);
  $weak = $weaks($wday);

サブルーチン

JavaやRubyでいうメソッドにあたる

sub サブルーチン名{~~~~}のように記述。

一定の処理をまとめて他から呼び出せます。

処理の再利用には必須なので覚えておきましょう。

サブルーチンに引数を渡す

Perlの書き方で特殊にみえるのがサブルーチンの引数でしょう。

簡単なものからいくつか実例をあげてみます。

単一のスカラー変数を渡す

サブルーチンに渡された引数は@_というデフォルト変数として扱われます。 たとえ、スカラー変数だろうと、一度は配列の一要素として扱われるので、 「shift:配列の最初の要素を取得」で取り出し、ローカル変数に代入することができます。


sub func1{
  my $str = shift;
  $str .= 'だぜ';
  return $str;
}

print func('マリサ');
# マリサだぜ

配列を引数に渡す

そのままlistのように渡すことも可能。



sub func2{
  my ($num1, $num2, $num3) = @_;
  my $answer = ($num1 + $num2) * $num3;
  return $answer;
}

print func2(1,2,3);
# (1 + 2) * 3 
# 9

連想配列を引数に渡す

そのままlistのように渡すことも可能。



sub func2{
  my (%hash) = @_;
  return %hash{word};
}

print func2((
	id => 2,
	word => '真珠'
));
# 真珠

連想配列を引数に渡す

そのままlistのように渡すことも可能。



sub func2{
  my (%hash) = @_;
  return %hash{word};
}

print func2((
	id => 2,
	word => '真珠'
));
# 真珠

リファレンスを引数に渡す

前回の連想配列をリファレンスとして引数にする

変更点はサブルーチン側の受け取りが $ リファレンスに。

サブルーチン側への受け渡し時の括弧が ()から{}に変化している。



sub func2{
  my ($hash) = @_;
  return %hash->{word};
}

print func2({
	id => 2,
	word => '真珠'
});
# 真珠

配列と文字列を引数に渡す

Perlに慣れない人はこのへんで引っかかる人は多そう。

変数の前に「\」をつけてリファレンス化したものを引数に渡しましょう。

サブルーチン内でその引数はオブジェクトのように扱われます。



sub func3{
  my ($my_array, $my_str) = @_;
  my $word;
  foreach my $line (@{$my_array}){
    $word .= $line. 'と';
  }
  $word .= 'にとりは'.$str.'です';
  return $word;
}


my @array = (
  "ルイージ",
  "けろちゃん",
  "ガンキャノン",
);
my $str = "皆仲良し";

print func3(\@array, $str);
# ルイージとけろちゃんとガンキャノンとにとりは皆仲良しです

パッケージ

パッケージを作成する


MyPackege.pm


#!/usr/bin/perl
package MyPackege;

sub new{
    my $class = shift;
    my %conf  = @_;
    
    $conf{dir}   = './n/' unless defined $conf{dir};
    $conf{csv}   = '_data.csv' unless defined $conf{csv};
    
    return bless {%conf}, $class;
}

sub calcAdd{

}
1;

パッケージを宣言・呼び出す


index.cgi


#!/usr/bin/perl
use MyPackege;

my $mp = new MyPackage();

有名なPerl使い

技術本探しに。

PerlでつくられたCGI / WEBサービス

KENT WEB

レンタル掲示板で大流行を引き起こしたフリーCGI配布サイト。古い書き方だが、ソース自体はわかりやすく勉強になると思う。

はてな

はてなアンテナ・はてなブックマークなどの人気サービス。

Perlのアップデート

Perl本体のバージョンを更新する

http://www.perl.com/

v5.6からv5.8.9に


(FreeBSD)
wget http://www.cpan.org/src/perl-5.8.9.tar.gz
tar zxvf perl-5.8.9.tar.gz

# cd /usr/ports/lang/perl5.8
# make
# make install clean

perl -MCPAN -e autobundle

Perl6

「クリスマス」にリリース予定らしい。

Perlの復権なるか!?

Perl5までの後方互換性を捨てる、という噂もある。


01234567890123456789012345678901234567890123456789012345678901234567890123456789
# 1行80文字入りきるか表示テスト