naobe @ ウィキ
perl
最終更新:
naobe
-
view
言語に戻る
配列の代入
$b = \@b; @a = @{$b}; push @a,10;
上記では、@bをコピーしたものを@aに設定する(@aと@bはアドレスが異なる)。よって、10は@bには挿入されない。
perldoc
項目 | 説明 |
---|---|
perldoc perl | 調査項目のリストアップ |
perldoc perlrun | 起動オプションを調べる |
perldoc perlsyn | 文法を調べる |
perldoc Class::Struct | モジュールを調べる |
perldoc -m Class::Struct | モジュールのソースコードを表示する |
perldoc -l Class::Struct | モジュールのディレクトリを調べる |
perldoc -f open | ビルトイン関数を調べる |
perlpod
perlのドキュメントフォーマット。マークアップ言語。Podのマークアップは3種類のパラグラフからなる。 ordinary, verbatim,
command。
Ordinary Paragraph
パッケージ
モジュールのディレクトリを調べる
for $path ( @INC ) { print $path, "\n"; }
時刻関連
1 #!/usr/bin/perl 2 3 use strict; 4 use Time::Local; 5 use Time::localtime; 6 7 # 現在の時刻を求める 8 my $tmref = localtime(); 9 printf( "本日 %d/%d/%d %d:%d:%d\n", $tmref->year()+1900,$tmref->mon()+1,$tmref->mday(),$tmref->hour(),$tmref->min(),$tmref->sec()); 10 print "\n"; 11 # 通算秒を求める 12 my $time = timegm(0,0,0,1,0,1970); 13 print "1970/1/1 00:00:00 GM 通算秒:", $time,"\n"; 14 print "\n"; 15 # 指定日の1日前を求める 16 $time = timelocal(0,0,0,1,2,2016); 17 $tmref = localtime($time); 18 printf( "指定日 %d/%d/%d %d:%d:%d\n", $tmref->year()+1900,$tmref->mon()+1,$tmref->mday(),$tmref->hour(),$tmref->min(),$tmref->sec()); 19 20 $time -= 60 * 60 * 24; 21 $tmref = localtime($time); 22 printf( "1日前 %d/%d/%d %d:%d:%d\n", $tmref->year()+1900,$tmref->mon()+1,$tmref->mday(),$tmref->hour(),$tmref->min(),$tmref->sec());
【実行結果】
[suna@athlon4 perl]$ ./time.pl 本日 2013/5/18 9:20:49 1970/1/1 00:00:00 GM 通算秒:0 指定日 2016/3/1 0:0:0 1日前 2016/2/29 0:0:0
Carp
警告を出力する。例外を出力して停止する。
use Carp qw(croak); sub sub1 { print "aaa\n"; croak( "Exception occured."); print "bbb\n"; } sub1;
【実行結果】
[foo@athlon4 perl]$ ./7.pl aaa Exception occured. at ./7.pl line 7 main::sub1() called at ./7.pl line 11
構造体
構造体のフィールドは、種類を示す。$:スカラ、@:配列、%:ハッシュ
1 #!/usr/bin/perl -w 2 # 構造体を使う 3 4 use Class::Struct; 5 use Data::Dumper; 6 use strict; 7 8 struct Person => { 9 name => '$', 10 father => '$', 11 mother => '$' 12 }; 13 14 my $p1 = new Person; 15 $p1->name('john'); 16 $p1->father('tom'); 17 $p1->mother('karen'); 18 19 print $p1->name(),"\n"; 20 print $p1->father(),"\n"; 21 print $p1->mother(),"\n"; 22 23 my $p2 = new Person; 24 $p2->name("mery"); 25 $p2->father("startk"); 26 $p2->mother("guiness"); 27 28 print Dumper($p2);
配列の場合は、$p1->child(0, 'merry');$p1->child(1, 'ann');のように使う。ハッシュの場合は、$p1->note('key', 'value');のように使う。
オブジェクト指向
パッケージがクラス。newサブルーチンでインスタンスを作成する。newの中で無名のハッシュ参照を作成し、最初の引数のクラス名(パッケージ名)とblessする。blessは、ハッシュ参照とクラス名を関連付けた参照を返す。これがインスタンスの参照となる。インスタンスの参照からクラス内のサブルーチンを呼び出せる。
@ISAにスーパークラスを書き込むと、サブクラスになる。@ISAは、単に自分にないメソッドを探す順番を決めるために使われる。メソッドの探索は再帰的に行われる(親に親があれば、親の兄妹より先に探す)。フィールドは継承しない。複数のスーパークラスを継承できる。
【oo.pl】
@ISAにスーパークラスを書き込むと、サブクラスになる。@ISAは、単に自分にないメソッドを探す順番を決めるために使われる。メソッドの探索は再帰的に行われる(親に親があれば、親の兄妹より先に探す)。フィールドは継承しない。複数のスーパークラスを継承できる。
【oo.pl】
1 #!/usr/local/bin/perl 2 # オブジェクト指向 3 4 # パッケージがクラスになる 5 use strict; 6 use util::Person; # パーソンクラスを使う 7 use util::Engineer; # エンジニアクラスを使う 8 9 # パーソンクラスを作成 10 my $ref = util::Person->new("suna"); 11 12 # 名前を表示する 13 print "name: ",$ref->getName,"\n"; 14 15 # 名前を変える 16 $ref->setName( "nao"); 17 18 # 名前を表示する 19 print "name: ",$ref->getName,"\n"; 20 21 # エンジニアクラスを作成する 22 my $eref = util::Engineer->new("nori"); 23 24 # 名前を表示する 25 print "name: ",$eref->getName,"\n"; 26 27 # 名前を変える 28 $eref->setName( "non"); 29 30 # 名前を表示する 31 print "name: ",$eref->getName,"\n"; 32 33 # スキルを設定する 34 my $skillref = ["db2","java","perl"]; 35 $eref->setSkill($skillref); 36 37 # スキルを表示する 38 my $eeref = $eref->getSkill; 39 for my $skill ( @$eeref ) { 40 print $skill,"\n"; 41 }
【util/Person.pm】
1 #!/usr/local/bin/perl 2 3 package util::Person; 4 5 sub new { 6 my $clas = shift; 7 bless { 8 name => shift 9 }, $clas; 10 } 11 12 sub getName { 13 my $self = shift; 14 return $self->{name}; 15 } 16 17 sub setName { 18 my $self = shift; 19 $self->{name} = shift; 20 } 25 26 1;
【util/Engineer.pm】
1 #!/usr/local/bin/perl 2 3 package util::Engineer; 4 5 @ISA = ("util::Person"); 6 7 sub setSkill { 8 my ($self, $skillref) = @_; 9 $self->{skill} = $skillref; 10 } 11 12 sub getSkill { 13 my $self = shift; 14 return $self->{skill}; 15 } 16 17 1;
【実行結果】
[suna@athlon4 perl]$ ./oo.pl name: suna name: nao name: nori name: non db2 java perl
固定長ファイルの扱い
【asciiのみ】
fix.dat
fix.dat
11223334444555552122333444455555
上記ファイルを16バイト/レコードとして読み込む。
#!/usr/bin/perl # 固定長レコードのファイルを読み込む use strict; my $FILE = "fix.dat"; open IN, $FILE or die "file open error!! $FILE"; binmode IN; my $rec; my $TEMPLATE = "A1A1A2A3A4A5"; while( 1 ) { my $size = read IN, $rec, 16 ; if( $size == 0 or $rec == "\n") { last; } my @t = unpack $TEMPLATE, $rec; for my $term (@t) { print $term, ","; } print "\n"; } close IN;
実行結果
[foo@athlon4 perl]$ 3.pl 1,1,22,333,4444,55555, 2,1,22,333,4444,55555,
【Shift-JIS込み】
bin.dat
bin.dat
123山田太郎12345123磯野一郎12345
#!/usr/bin/perl # 固定長レコードのファイルを読み込む(Shift-JIS込み) use strict; use Encode; use encoding "utf-8"; my $FILE = "bin.dat"; open IN, $FILE or die "file open error!! $FILE"; binmode IN; my $rec; my $TEMPLATE = "A3a8A5"; while( 1 ) { my $size = read IN, $rec, 16 ; if( $size == 0 or $rec == "\n") { last; } my @t = unpack $TEMPLATE, $rec; my $i = 0; for my $term (@t) { $i++; if( $i == 2 ) { $term = decode("cp932", $term); } print $term, ","; } print "\n"; } close IN;
実行結果
[foo@athlon4 perl]$ 4.pl 123,山田太郎,12345, 123,磯野一郎,12345,
Win --> Unixファイル変換
perl -pe 's/\r\n/\r/' winfile > unixfile
ShiftJiSを使う
perl5.8.1以上
use encoding "shiftjis"; binmode STDERR, ":encoding(shiftjis)"; use Encode 'decode'; while (<IN>) { # ファイルからの入力にエンコードを指定する。ここでは shiftjis を指定しているが, # 入力ファイルのエンコードにあわせ,euc-jp なども指定可能。 $line = decode('shiftjis', $_); print $line; # 標準出力なので encoding プラグマにより Shift JIS に自動変換される。 } close (IN);
#!/usr/bin/perl use Encode; open IN, "/home/suna/tmp/wiki.txt"; while( $line = <IN> ) { $line = decode('cp932', $line); # Shift-JIS(cp932)をutf-8に変換 chomp $line; print $line, "\n"; } close IN;
pack, unpackの TEMPLATE
TEMPLATEは、
型 | 説明 |
---|---|
a | 任意のバイナリデータ。null(\0?)がパディングされる |
A | ASCII文字。空白がパディングされる。 |
b | ビット文字。昇順のビットオーダ。 |
B | ビット文字。降順のビットオーダ。 |
h | 16進文字。低位の4ビットが先。 |
H | 16進文字。高位のの4ビットが先。 |
c | サイン付キャラクタ。 |
C | サインなしキャラクタ。 |
s | signed short |
S | unsigned short |
i | signed integer |
I | unsigned integer |
l | signed long |
L | unsigned long |
ENCODING
以下を使って求めた。perldoc Encode参照
#!/usr/bin/perl use Encode; @with_jp = Encode->encodings("Encode::JP"); for $encoding (@with_jp) { print $encoding, "\n"; }
項目 | 説明 |
---|---|
7bit-jis | |
ascii | |
ascii-ctrl | |
cp932 | |
euc-jp | |
iso-2022-jp | |
iso-2022-jp-1 | |
iso-8859-1 | |
jis0201-raw | |
jis0208-raw | |
jis0212-raw | |
MacJapanese | |
null | |
shiftjis | |
utf-8-strict | |
utf8 |
関数
項目 | 説明 |
---|---|
read FILEHANDLE,SCALAR,LENGTH[,OFFSET] | FILEHANDLEからLENGTHバイト読み込んで変数SCALARに保管する。OFFSET指定するとSCALARの先頭からOFFSET位置から更新する。読み込んだバイト数を返す。ファイル終端では0を返す。 |
pack TEMPLATE,LIST | LISTをTEMPLATEに指定した形式で変数に格納し返す。 |
unpack TEMPLATE, EXPR | 変数EXPRをTEMPLATEに従って配列に展開する。 |
Encode::encode(ENCODING, $string [, CHECK]) | ENCODINGに従って$stringをエンコードして返す。CHECK?? |
Encode::decode(ENCODING, $string [, CHECK]) | ENCODINGに従って$stringをデコードして返す。 |
その他
項目 | 説明 |
---|---|
複数行に渡るコメント | コメントの最初:=pod,コメントの最後:=cut |