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 |
