予習用のメモ

個人的なメモ書き
復習の解

  • 文字列置換のsyntaxが変態すぎる。
 $mail =~ s/\@/(at)/; 

と書いた時に、$mail に置換後の文字列が格納されて、この式全体としては置換した数が返ってくるらしい。
どうしてこうなった。

r オプションを使うと、若干マシになるような気がする

 my $replaced = ($mail =~ s/\@/(at)/r); 

とすることで、代入なんだかマッチングなんだかよくわからんストレスから若干解放される。
こうしておくと、map の使い方サンプルにある $mail 一時変数は不要になって

my @no_spam = map { s/\@/(at)/r } @mails;

となって良い。あるいは @mails 変数をぶっ壊してもいいなら

map { s/\@/(at)/ } @mails;

ともできるけど、map の名前に破壊的なニュアンスがないので止めたほうがいいと思う。

やっぱり思考の流れと、書き順が逆のような気がするよね。 @mails - [ 変換規則 ] -> @no_spam だと思うんよね。この順だと、map や grep を重ねた時もそんなに違和感がない @mails - [ フィルター ] -> [ 変換規則 ] -> [ さらにフィルター] -> @wanderful_mails みたいに。後ろに後ろにフィルターを追加するのは苦しい。

あと、 $_ の正体がいまいちよくわかっていない。
また、grep や map でもとの配列の順番は保持されると考えてよいのか?

細かいけど、 grep や map に与える引数のブロックの最後のセミコロンは付けるべき?

grep を使っても $_ を書き換えてしまうことで、 map と同じことができるのではないか?

my @no_spam = grep { s/\@/(at)/ } @mails;

こんなん。
で、map の演習

試してみたら、関数入れ子にできた。
もリストコンテキストでは配列なのでgrepできそうだね

print grep { /perl/ } <STDIN>;

みたいな


正規表現も日本語の扱いが問題になる。一文字が日本語一文字にマッチして欲しい。全角空白は \s にきっとマッチしないし、

その他正規表現関連の疑問を羅列

  • 演算子 =~ が返すのは真偽値?文字列中でマッチした場所、例えば 'Hello' =~ /e/ が 2文字目でマッチしたとして 「2」を得る方法は?
  • 複雑な正規表現が「うまく行っている」ことを確認する簡単な方法はないか?イメージは emacs の re-builder みたいな感じ。emacs正規表現がまた perl のそれと全然違うんだよなぁ(愚痴)
  • 正規表現のグループキャプチャ、$1 〜 $9 でそれを越えるともう無理?
  • 正規表現リテラルで変数が展開されているが、@list のようなリストはどうなるのか?
  • 正規表現リテラル正規表現の参照は交換可能なのか?例えば正規表現を引数に取るような関数 my_match() のようなものを書いた時、my_match(/hello/) と my_match(qr/hello/)は同じ効果が得られるのか?関数の実装の中で受け取る引数 @_ には正規表現の参照がセットされているのか?
  • 変数の正規表現 // 中での展開ってどのくらいまでいけるの?例えば変数 my $count に 4 がセットされていたとして、/a{$count, 10}/ みたいに量化指定子として展開したりできる?
  • gオプションで繰り返しマッチする場合、グルーピングしていない正規表現に意味はあるのか?

で、最後の演習