<Tryings and Errors>
瑣末な知識と瑣末な実験の記録。
超未整理。
[I/O][コマンドライン]<>と@ARGV
行入力演算子<>で間のファイルハンドルを省略すると、
自動的に標準入力STDINから1行を読み込む。
ただし、これが可能なのは
スクリプトにコマンドライン引数が渡っていない=@ARGVが空である場合に限られる。
実は、<>のファイルハンドル省略時に使用されるハンドルはSTDINではなく"ARGV"で、
これは@ARGVの要素を順番に並べた物に対するファイルハンドルなので、そのまま<>を使うと@ARGVの中身を読み取ることになる。
[ハッシュ][map]ハッシュにmap
map関数には、配列と同様にしてハッシュも使用することができる。
ただし、インクリメントや置換など、与えたハッシュそのものを変えようとする処理は
キー変数を変更できない。
例:
%hash = (
a=>1,
b=>2
);
print map {tr/[a-z]/[A-Z]/; $_} %hash; #A1B1
print %hash; #a1b1
[配列][map]mapでフィルタ
配列を受け取って条件に合致するものだけを通す(フィルタ)処理をmapで行うとき、
「条件に合わないものを受け取ったときは
何も返さない」ということをやる必要がある。
この時は、「空行(セミコロンだけの行)」を置けばよい。
@ary1 = ('a', 'b', '3', 'd');
@ary2 = map {if(m/[a-z]/){$_;}else{;}} @ary1;
print @ary2; #'abd'
[配列][ハッシュ]空ハッシュ
空配列・空ハッシュの作り方は、両者共に空リストの代入、つまり
@blank = ();
%blank = ();
「%blank = {};」ではない。
[パターンマッチング]パターン部を変数にする
m/a|b|c/;
は、
$pattern = 'a|b|c';
m/$pattern/;
と書いてもよい。
[パターンマッチング]柔軟な置換処理
置換演算子s///に修飾子eをつけると、置換部を式とみなして実行する。例えば、
s/A(.*?)A/&sub($&)/e;
とすると、パターン部(両端がAであるような最短の部分)に合致すると、
合致部分を引数としてサブルーチンsubに渡し、その戻り値で置き換える。
[パターンマッチング]パターンによる場合分け
特殊変数
$+は、パターン内の括弧()で囲んだ部分のうち、
マッチした中で最後のものを表示する(最後=閉じ括弧)の位置が最も右のもの)。
これを利用すると、
m/(strike)|(spare)|(split)/;
と指定しておくと、"strike"、"spare"、"split"のいずれかにマッチし、
かつ、どれにマッチしたかが$+を参照することでわかる。
例:
$_ = "strikes back!";
m/(strike)|(spare)|(split)/;
print $+; #'strike'と表示される。
この例では有難味が全くわからないが、パターンの各選択肢毎に捕まえたい箇所が異なるときに有用となる。
[パターンマッチング][ネタ]循環置換
コード:
$s1 = $s2 = 'abcdefghijklmnopqrstuvwxyz';
print "$s1\n";
while(1){
$s1 =~ tr/a-z/b-za/;
print "$s1\n";
if($s1 eq $s2){last;}
}
結果:
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyza
cdefghijklmnopqrstuvwxyzab
defghijklmnopqrstuvwxyzabc
efghijklmnopqrstuvwxyzabcd
fghijklmnopqrstuvwxyzabcde
ghijklmnopqrstuvwxyzabcdef
hijklmnopqrstuvwxyzabcdefg
ijklmnopqrstuvwxyzabcdefgh
jklmnopqrstuvwxyzabcdefghi
klmnopqrstuvwxyzabcdefghij
lmnopqrstuvwxyzabcdefghijk
mnopqrstuvwxyzabcdefghijkl
nopqrstuvwxyzabcdefghijklm
opqrstuvwxyzabcdefghijklmn
pqrstuvwxyzabcdefghijklmno
qrstuvwxyzabcdefghijklmnop
rstuvwxyzabcdefghijklmnopq
stuvwxyzabcdefghijklmnopqr
tuvwxyzabcdefghijklmnopqrs
uvwxyzabcdefghijklmnopqrst
vwxyzabcdefghijklmnopqrstu
wxyzabcdefghijklmnopqrstuv
xyzabcdefghijklmnopqrstuvw
yzabcdefghijklmnopqrstuvwx
zabcdefghijklmnopqrstuvwxy
abcdefghijklmnopqrstuvwxyz
accend->Perl->labnote->index page