Top > Perl

入門 Edit

クイックチュートリアルとしてはこのページが秀逸。
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_lecture.html

環境 Edit

REPLインタープリタ perl -de 0 Edit

$ 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コマンド Edit

関数を調べる

perldoc -f substr

モジュールを調べる

perldoc Data::Dumper

言語 Edit

複数行コメント =pod~=cut Edit

=pod
コメント…
=cut

変数のスコープ Edit

#!/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した場合の変数のスコープ Edit

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相当) Edit

#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
        ]; 

ファイル Edit

テキストファイル読み込み Edit

my $str = "";
open(IN, "<".$filename);
while (<IN>) {
    $str .= $_;
}
close(IN);

テキストファイル書き出し Edit

open(OUT, ">".$filename);
print OUT $str;
close(OUT);

ファイルリストを取得(glob) Edit

@a = glob('*');
print join("\n", @a);

'*'だと、ドットで始まるファイルはマッチしないので注意。

ファイルリストを再帰的に取得(File::Find) Edit

use File::Find;

File::Find::find(
    sub { if ($File::Find::name =~ /\.pl$/) { print $File::Find::name,"\n"; } },
    "."
);

メール Edit

SMTP AUTH Edit

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のエラーログに出力される。

日本語関連 Edit

概要 Edit

Perl 5.6でUnicode対応。しかしその時点ではソースはUTF-8で書くしかなく、使い物にならず。
Perl 5.8で本格対応。

Perl 1.01987年12月18日
Perl 2.01988年6月05日
Perl 3.01989年10月18日
Perl 4.01991年3月21日
Perl 5.01994年10月17日
Perl 5.6.02000年5月22日
Perl 5.8.02002年7月18日
Perl 5.10.02007年12月18日にリリース

ソースファイルの文字コードを指定する Edit

ソースファイルを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になる

扱うファイルの文字コードが予めわかっている場合 Edit

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

正規表現でない置換 Edit

検索文字列に日本語が含まれている場合、置換演算子を使うとうまくいかないことがある。
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;
}


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes