これは,私が所属する研究室内で行なっているperl講習会用に書いたもの
自然言語処理では、大量のテキストから必要な情報を取り出さなければ ならない機会も多い. C 言語で高度なテキスト処理をするプログラムを書くのは面倒なことが多いが, Perlなら手軽に書くことができる.
% perl <スクリプト名> <対象ファイル> または % <スクリプト名> <オプション> (UNIXのみ)
後者の場合はPerlスクリプトの1行目に "#!/usr/bin/perl" と 書くことと, スクリプト自体を実行可能にしておくことが必要(c.f. chmod). "#!/usr/bin/env perl"でもよい.
$hoge = 123; print $hoge; # 123
$hoge = 123; print $hage; # 何も出力されない
$hoge = 'とりあえず文字列'; print '$hoge'; # $hoge print "$hoge"; # とりあえず文字列
$a = 123; $b = 456; print $a + $b; # 579 print $a . $b; # 123456 ("."は文字列を連結する演算子)
@tmp = (1, 2, 3); print $tmp[0]; # 1
print $tmp[$#tmp]; # 3
print @tmp; # 123 print @tmp + 0; # 3
@tmp = ();
print $tmp[$i] if exists $tmp[$i];
$tmp{'文字列'}, $tmp{$hoge}
%tmp = ( aaa => 10, bbb => 20, ccc => 30 ); print $tmp{'bbb'}; # 20
print keys(%tmp); # cccbbbaaa print values(%tmp); # 302010
%tmp = ( aaa => 10, bbb => 20, ccc => 30 ); while ( ($key, $value) = each %tmp ) { print "$key,$value\n"; }
%tmp = ();
print $tmp{'aaa'} if exists $tmp{'aaa'};
$matrix[0][1] = 1; $hash{'hoge'}[3] = 'hogehoge';
if( $option eq 'a' ){ print $value_a; } elsif( $option eq 'b' ){ print $value_b; } else{ print 'no option'; }
print $hoge if $option eq 'a';
$i = 0; while( $i < 10 ){ print "i = $i\n"; $i++; }
for( $i = 0; $i < 10; $i++ ){ print "i = $i\n"; }
@tmp = ('apple', 'orange', 'banana'); foreach $value ( @tmp ){ print "$value\n"; }
foreach $key ( keys %hash ){ print "$key $hash{$key}\n"; }
foreach $key1 ( keys %hash ){ foreach $key2 ( keys %{$hash{$key1}} ){ print "$key1, $key2, $hash{$key1}{$key2}\n"; } }
LABEL: foreach $n ( @hoge1 ){ foreach $m ( @hoge2 ){ if ( not $m == 1 ){ next LABEL; } ... } }
数値の比較 | 文字列の比較 | 意味 |
---|---|---|
> | gt | より大きい |
=> | ge | 以上 |
< | lt | より小さい |
<= | le | 以下 |
== | eq | 等しい |
!= | ne | 等しくない |
<=> | cmp | 左辺が大きいとき -1 等しいとき 0 右辺が大きいとき 1 |
$a = '1'; $b = '1.0'; print $a == $b, "\n"; # 1 print $a eq $b, "\n"; # (なにも出力されない)
$a = 1; $b = 1.0; # a,bともに数値の1 print $a == $b, "\n"; # 1 print $a eq $b, "\n"; # 1
$var =~ m/正規表現/ もしくは $var =~ /正規表現/
$var = 'abcabc'; $var =~ m/cab/; # match!
$var = 'ABCABC'; $var =~ /cab/i; # match!
$var =~ s/検索文字列(正規表現)/置換文字列/;
$var = 'ababab'; $var =~ s/ab/X/; print $var, "\n"; # Xabab $var = 'ababab'; $var =~ s/ab/X/g; print $var, "\n"; # XXX
sub add { my @hoge = @_; # 引数からなる配列を内部のローカル変数にコピー return $hoge[0] + $hoge[1]; } $number = &add(3, 4); # 7
関数名($a, $b, $c); 関数名 $a, $b, $c;
print "kotae ha ", 123 + 235, " desu", "\n";
$tmp = 123.456; printf "%.1f", $tmp; # 123.4
@hoge = split( /パターン/, 文字列, <最大分割数>);
$hoge = join( 区切り文字, 配列 ); $string = 'a:b:c'; @list = split(/:/, $string); # (a, b, c) print join('%', @list); # a%b%c
$hoge = substr(文字列, 先頭位置, 長さ); substr(文字列, 先頭位置, 長さ) = 割り込ませる文字列;
@ary_sorted = sort @ary;
sort { $hash{$a} <=> $hash{$b} } keys %hash;
@ary = ('green'); # ( 'green' ) push(@ary, 'blue'); # ( 'green', 'blue' ) unshift(@ary, 'red'); # ( 'red', 'green', 'blue') $tmp = pop(@ary); # ( 'red', 'green' ) $tmp = shift(@ary); # ( 'green' )
$string = 'abc'; $string =~ tr/a/x/; # xbc $string =~ tr/a-z/A-Z/; # XBC
$tmp{'aaa'} = undef; print exists $tmp{'aaa'}; # 1 print defined $tmp{'aaa'}; # ''
open(FP, "$hoge") or die "can't open $hoge"; # 読み込み open(FP, "> $hoge") or die "can't open $hoge"; # 書き込み open(FP, ">> $hoge") or die "can't open $hoge"; # 追加書き込み
open(FP, "zcat hoge.gz |") or die; # gzipファイルの読み込み open(FP, "| gzip > hoge.gz") or die; # 出力をgzipで圧縮
open(FP,"<:utf8", $file); # UTF8のテキストを読み込む open(FP,"<:encoding(cp932)", $file); # cp932(shiftjis)のテキストを読み込む open(FP,">:encoding(euc-jp)",$file); # euc-jpのテキストを書き出す open(FP,"<:raw", $file); # バイナリで読み込む
close(FP);
$one_line = <FP>; # 一行だけ読み込んで,残りはそのまま @all_line = <FP>; # 全ての行が配列に一度に入る while ( $line = <FP> ){ # <FP>が最後までいくとEOFになり偽になる ... # 一行単位で $line の処理ができる }
while( <> ){ # $_ に一行ずつ入力される ... }
print FP "This is test\n";
if ( $num > 0 ) { my $hoge; # $hoge はif文のブロック中だけで有効 ... }
sub print_a { print $a, "\n" } # サブルーチンを定義 $a = 'abc'; &print_a; # 'abc' { # 明示的にスコープを作成 my $a = 'def'; print $a, "\n"; # 'def' &print_a; # 'abc' } { local $a = 'ghi'; print $a, "\n"; # 'ghi' &print_a; # 'ghi' } &print_a; # 'abc'
foreach ( @ARGV ){ print $_, "\n"; # 呼び出し時の引数をすべて出力 }
while(<>){ chomp; # 改行をとる s/abc/xyz/; # abcをxyzに置換 if(/str/){ # 文字列にstrがあったら print; } } # 以下と等価 while($_ = <STDIN>){ chomp $_; $_ =~ s/abc/xyz/; if($_ =~ /str/){ print STDOUT $_; } }
$| = 1; # 出力をバッファリングしない
正規表現 = パターンマッチの際に使う特殊な記述形式
a+ (長さ1以上の a の列) abc* (abの後にcが0個以上続く文字列)
[abc] (a または b または c) [0-9]+ (長さ1以上の数字の列) [^0-9A-Z]+ (数字とアルファベット大文字以外の列)
abc|ace (abc または ace)
.. (任意の文字2つ) .+ (任意の文字列)
^abc (abcで始まる文字列) [0-9]$ (数字で終わる文字列)
^, $, +, -, *, ?, [, ], {, }, (, ), \, ., |
a(bc|cb)(de|ed)f (abcdef, abcedf, acbdef, acbedf のどれか)
[0-9]{1,10} (長さが 1 以上 10 以下の数字列) [0-9]{3,} (3 桁以上の数字列) [0-9]{3} (3 桁の数字列)
\-?([1-9][0-9]*)?[0-9](\.[0-9]+)? (普通の数)
This 'test' isn't successful. /'.*'/ ('test' isn' マッチ.通常は最大の文字列にマッチ) /'.*?'/ ('test' にマッチ)
\sは[\t\n\r\f] と同じ(\t:タブ,\r:復帰,\f:なんだっけ?) \Sは[^\t\n\r\f] と同じ
\wは[a-zA-Z0-9_] と同じ
\dは[0-9] と同じ
\bは\wと\Wの間にマッチ
文字コードがEUCなら簡単な処理はそのままできる.
主に次の3つのやり方がある.
use LWP::Simple; $doc = get 'http://www.sn.no/libwww-perl/';
Up(P): Home
間違え,勘違い,スペルミスなどは
まで
Last modified: Mon Feb 21 20:01:04 JST 2005