1. はじめに
1.1. コマンドでの使い方
perl -e 'perlのコード'
echo 'perlのコード' | perl
2. サンプルコード
2.1. htmlファイルからリンクを抜き出す
2.2. ファイルの各行左2文字を削って表示
perl -e 'while(my $line = <>){print join("",substr($line,2,-1),"\n");}' ファイル名
2.3. カンマ区切りのデータを2次元配列として読み込む
#!/usr/bin/perl
#読み込み
my $data = [];
while (my $line = <>)
{
chomp $line;
my @arrayed_line = split(',',$line);
push @$data, \@arrayed_line;
}
#表示
foreach $i (@$data)
{
foreach $j (@$i){print "$j-";} print "\n--------\n";
}
3. 正規表現
3.1. 具体例
■パターンマッチ
if ($str =~ /正規表現/) {}
→正規表現にマッチした場合、真となる
→!~はマッチしない場合真となる
→$変数 =~ /正規表現/gimosxというフォーマット
■マッチした文字の取得($1等)
$str="こんにちは";
if($str =~ /こん(.*)は/){print "マッチした文字:$1";}
■1回置換(s/正規表現/置換する文字/)
$str="置換前の文字列です。置換されてません。";
if($str =~ s/置換/痴漢/){print "$str";}
■全部置換(s/正規表現/置換する文字/g)
$str="置換前の文字列です。置換されてません。";
if($str =~ s/置換/痴漢/g){print "$str";}
3.2. 正規表現で使われる文字
. 改行を除くすべての文字
\d 数字 ←→ \D 数字以外
\w ワード文字(abc..012.._) ←→ \W ワード文字以外
\s 空白文字( スペース・タブ文字・改行など) ←→ \S 空白文字以外
^ 文字列の先頭 ←→ $ 文字列の末尾
h{1,4}→hが4回続けて現れている。
4. 特殊変数
5. 文法基礎
5.1. いきなり他人まかせ
5.2. 個人的に気になった点など
■myとlocal
my=レキシカルスコープ
→宣言されたサブルーチンのみでアクセス可
→スコープから外れると破棄
local=ダイナミックスコープ
→サブルーチンから呼び出されたサブルーチンでもアクセス可
→スコープから外れると破棄
■foreach
@array=(1,2,3,4,5);
foreach $i (@array){print $i}
■サブルーチン
sub sum{ ($p1,$p2)=@_; return $p1+$p2}
print sum(5,6);
■ファイル入出力
open my $fh, '<', $file #<は読み込みモード
or die "Cannot open '$file': $!";
while(my $line = <$fh>) { }
close $fh;
cf.ファイルからすべて読み込む場合は
my @lines =; #配列で読み込むと、各行が配列の要素になる
my $content = join '',@lines;
■その他特徴的な文法
・一気に代入(リスト代入)
→my ($num1,$num2) = ($num3,$num4);
・偽と扱われる値
→undef/''/0/'0'
・定義されているか判定
→defined $num;
・コマンドライン引数
→my($file,$options)=@ARGV;
→ひとつだけ取得は my $file = shift;
・unless文
・if,unlessの後置
→print $num if $num > 3;
・配列やハッシュの指定要素のみ配列として取得
→@select = @arry[1,3,4];
→@select = @hash{'a','b','d'};
・配列各要素に操作をする($_は配列の各要素)
→@mapped = map {$_ * 2} @array;
・条件に一致した要素のみ配列として取得
→@select = grep { $_ =~ 'cat'} @array;
・演算子色々
範囲演算子 :@a = ('A' .. 'X'); #大文字すべての配列を得る
文字列リスト演算子 :my @st = qw(文字列1 文字列2 文字列3);
もしくは my @st = qw/cat dog mouse/;
→クォーテーションとカンマが不要に
.= :文末に追加
x= :変数を繰り返す
$ch = 10;
print $x x= 2;
> 1010
&&= :左辺がTRUEなら右辺を代入
||= :左辺がFALSEなら右辺を代入
・例外処理
eval {
#例外補足範囲
#このなかでdie "ErrorMessage"として例外を投げた関数等を補足
#最後の{にセミコロンが必要なことに注意
};
if($@) {
#例外処理
#$@に例外メッセージが入ってる
}
・別のevalの意味→実行中に文字列を命令として、コンパイル実行
my $num = 100;
my $code = "print \"$num\n\""; # 後で eval で実行する
$num = 200;
eval $code; # 100
→実用性としては、コマンドライン引数を命令として実行することだろう
→SQLインジェンクション的なバグの原因に
・モジュール読み込みはuse
・Jcode.pmやJcode.plではなくencodeモジュールを使う
6. 分野別文法各論
6.1. 配列のリファレンスサンプル
#!/usr/bin/perl
my @index = ("映画名","監督");
#無名配列のリファレンス作成は[]
#→それを受ける変数の「$」movieに注意。movie自体もリファレンス
#配列のリファレンスは\@indexで取得
my $movie = [
\@index,
['ニューシネマパラダイス','ジュゼッペ・トルナトーレ'],
['北北西に進路を取れ','アルフレッド・ヒッチコック'],
['ライムライト ','チャールズ・チャップリン']
];
#ダイレクトに2次元配列にアクセスするには$movie->[][]
print "$movie->[0][0]\t\t\t\t\t$movie->[0][1]";
#デリファレンスには@$movie
foreach my $i (@$movie){ print "$i->[0] \t\t\t $i->[1] \n"; }