入門 
クイックチュートリアルとしてはこのページが秀逸。
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_lecture.html
環境 
REPLインタープリタ perl -de 0 
$ perl -de 0
Loading DB routines from perl5db.pl version 1.28
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
main::(-e:1): 0
DB<1> print 3*5;l
15
DB<2>
評価値が表示されないので、必ずprintしなければならない。
perldocコマンド 
関数を調べる
perldoc -f substr
モジュールを調べる
perldoc Data::Dumper
言語 
複数行コメント =pod~=cut 
=pod
コメント…
=cut
変数のスコープ 
#!/usr/local/bin/perl
$a = "global";
my $a = "global my";
print "1:", $a, "\n"; # => global my
mmm();
print "4:", $a, "\n"; # => global my
print "5:", $main::a, "\n"; #> global
sub mmm {
my $a = "in subroutine";
print "2:", $a, "\n"; => # in subroutine
print "3:", $main::a, "\n"; => # global
}
requireした場合の変数のスコープ 
requireされるファイル限定にしたい変数は my を指定すること。
package.pl
#!/usr/local/bin/perl
use strict;
package pkg;
my $a = "this is a";
$b = "this is b";
$pkg::c = "this is c";
our $d = "this is d";
use-package.pl
#!/usr/local/bin/perl
require "package.pl";
print $pkg::a, "\n";
print $pkg::b, "\n";
print $pkg::c, "\n";
print $pkg::d, "\n";
結果:
this is b
this is c
this is d
データのダンプ Data::Dumper(Rubyのpp、PHPのvar_dump相当) 
#pre{{
use Data::Dumper;
%a = ();
$a{"hoge"} = 123;
$a{"meso"} = (456, 789);
@b = (4, 2, 5, 6);
print Dumper(\%a);
print Dumper(\@b); }}
結果は
$VAR1 = {
'meso' => 789,
'hoge' => 123
};
$VAR1 = [
4,
2,
5,
6
];
ファイル 
テキストファイル読み込み 
my $str = "";
open(IN, "<".$filename);
while (<IN>) {
$str .= $_;
}
close(IN);
テキストファイル書き出し 
open(OUT, ">".$filename);
print OUT $str;
close(OUT);
ファイルリストを取得(glob) 
@a = glob('*');
print join("\n", @a);
'*'だと、ドットで始まるファイルはマッチしないので注意。
ファイルリストを再帰的に取得(File::Find) 
use File::Find;
File::Find::find(
sub { if ($File::Find::name =~ /\.pl$/) { print $File::Find::name,"\n"; } },
"."
);
メール 
SMTP AUTH 
Net::SMTPだけでなく、Authen::SASLモジュールが必要。
Authen::SASLはアーキテクチャ非依存なので、ファイルをコピーするだけで使えるはず。
use Net::SMTP;
my $smtp = Net::SMTP->new(<SMTPサーバ>, Debug=>1);
print $smtp->auth(<ユーザ名>, <パスワード>) ? "auth OK\n" : "auth NG\n";
print $smtp->mail(<メールアドレス>) ? "mail OK\n" : "mail NG\n";
$smtp->to(<メールアドレス>);
$smtp->data();
$smtp->datasend(<Form:とかTo:とかSubject:とか>);
$smtp->datasend(‘\n’);
$smtp->datasend(<メール本文>);
print $smtp->dataend() ? "dataend OK\n" : "dataend NG\n";
$smtp->quit;
Debug => 1 にするとSTDERRにログが出力される。
CGIの場合、STDERRはApacheのエラーログに出力される。
日本語関連 
概要 
Perl 5.6でUnicode対応。しかしその時点ではソースはUTF-8で書くしかなく、使い物にならず。
Perl 5.8で本格対応。
| Perl 1.0 | 1987年12月18日 |
| Perl 2.0 | 1988年6月05日 |
| Perl 3.0 | 1989年10月18日 |
| Perl 4.0 | 1991年3月21日 |
| Perl 5.0 | 1994年10月17日 |
| Perl 5.6.0 | 2000年5月22日 |
| Perl 5.8.0 | 2002年7月18日 |
| Perl 5.10.0 | 2007年12月18日にリリース |
ソースファイルの文字コードを指定する 
ソースファイルをShiftJISで記述する場合は
use encoding "cp932";
SJISには"shiftjis"もあるが、全角チルダ問題により、cp932を指定した方がよい。
UTF-8なら"utf8"。EUC-JPなら"euc-p"。JISは"iso-2022-jp"。
これをちゃんと書いておけば、length()なども正常に動くようになる。
#!/usr/local/bin/perl
use strict;
use encoding 'cp932';
my $s = "これはペンです。";
print length($s); # => 8になる
扱うファイルの文字コードが予めわかっている場合 
use open IO => ":encoding(cp932)"; # 全てのファイル入出力がWindowsのShiftJIS
use open IN => ":encoding(cp932)"; # 全てのファイル入力がWindowsのShiftJIS
use open OUT => ":encoding(cp932)"; # 全てのファイル出力がWindowsのShiftJIS
http://www.aritia.org/hizumi/perl/perlwin.html
正規表現でない置換 
検索文字列に日本語が含まれている場合、置換演算子を使うとうまくいかないことがある。
quotemeta()を使って検索文字列をエスケープする方法もあるが、
正規表現を使わないなら、以下のような単純な置換がよい。
sub nonRegexpReplace {
my ($str, $search, $replace) = @_;
my $idx = 0;
my $replaceLen = length($replace);
my $start = 0;
while (($idx = index($str, $search, $start)) != -1) {
substr($str, $idx, length($search)) = $replace;
$start = $idx + $replaceLen;
}
return $str;
}