<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