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】
 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
 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
 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
人気記事ランキング
ウィキ募集バナー