• ベストアンサー

s//とは?

$nyuuryoku=<STDIN>; chomp($nyuuryoku); $a=length($nyuuryoku); $nyuuryoku !~ s/[\0-\223]//g; $b=length($nyuuryoku); $mojisuu=$a-$b; という感じで全角と半角が混ざっていても文字数を判定しようと思っているのですが、ネット上のソースを参考に作ったのでいまいち理解できていません。 特に、$nyuuryoku !~ s/[\0-\223]//g; というのがどういう意味なのかがよく分かりません。$nyuuryoku =~ s/[\0-\223]//g; としても同じように動くようですし。 どなたか解説お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

この場合は,!~と=~の違いはこの場合は実感できないと思います. 置換が行われたかどうかによって式の評価値が変わります. この場合は特に気にしなくて良いですね. if($nyuuryoku =~ s/[\0-\223]//g){} などとして,正規表現にマッチする文字列があった場合に処理を分岐する. といった場合に使用します. $moji =~ s/正規表現 / 置換文字列/修飾子 で,$mojiの中から,正規表現に一致する文字列を置換文字列に置き換えます. 正規表現は省きますので,正規表現はgoogle検索してください. ここでは, $nyuuryoku =~ s/[\0-\223]//g; とありますから,$nyuuryokuという文字列変数のかから[\0-\223]にマッチする文字列をすべて削除するという意味です. [\0-\223]は,半角文字列を意図しているようなので,半角文字列を削除します. 正確には削除ではありません.//の中に何も書かれていないので何もないものに置き換える=削除となっています.

参考URL:
http://www.kent-web.com/perl/chap7.html
shaka001
質問者

お礼

分かりやすい解説ありがとうございます。 参考サイトでは、$nyuuryoku =~ s/[全角の文字コード]//g; としてあって、これで文字列の中の全角文字を消去する。と説明していたので[]の中に消したいものを書けばいいんだな程度の理解だったので上の解説はありがたいです。 ところで、自分としては !~ とすることで半角以外、つまり全角文字を消去させようとして使っていたのですが、どうなんでしょうか?

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>特に、$nyuuryoku !~ s/[\0-\223]//g; というのがどういう意味なのかがよく分かりません。 確かに意味不明な記述ですね。 $nyuuryoku !~ /[\0-\223]/; であれば、正規表現にマッチしなかったかどうかの判定ですし、 $nyuuryoku =~ s/[\0-\223]//g; であれば、$nyuuryoku を置換の対象にします。 が、 $nyuuryoku !~ s/[\0-\223]//g;  では Useless use of negative pattern binding (!~) in void context at xxxx.pl line 4 のように警告を食らいます。 正規表現の中身の \0-\223 というのもよくわかりません。 普通はこんな範囲を指定しても全半角でどうこうするときの役に立たないのですが。 ということで参考にしたページをもう一回見直すことをオススメします。

関連するQ&A