• ベストアンサー

コンテキストについて

パターンマッチを用いて、変数$numに、文字列$strが正の整数の場合はその値を代入し、そうでない場合はデフォルト値として定数を代入したいのですが、 ($num) = ($str =~ /^([1-9][0-9]*)$/) || 1; としても、正の整数としてマッチした場合でも、||の影響で||の左辺がスカラーコンテキストとして評価され、真値としての1が代入されて上手くいきません。 上記の用件を1行で満たすPerlらしいスクリプトがあったら是非教えてください。 宜しくお願いします。

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

パターンマッチに失敗した場合は空リストが返るので、これを利用する手があります。 ($num) = ($str =~ /^([1-9][0-9]*)$/, 1); 分かりにくいので、私なら絶対こんな書き方しませんが^^;

noname#37358
質問者

お礼

ご回答ありがとうございます。 おお、この例は個人的につぼに入りました。(笑 確かに分かりにくいですが、Perlらしさが出てて面白いですね。簡潔ですし。 マスターポイント発行させていただきます。

その他の回答 (3)

  • estea
  • ベストアンサー率44% (39/87)
回答No.3

$num = ($str eq $str + 0) ? $str : 1; こんなんでだめかいな。 正規表現って苦手なもので...

noname#37358
質問者

お礼

ご回答ありがとうございます。 この場合、負の整数でも値が返ってしまいますね。 ふと思ったのですが、 $num = ($str > 0) ? $str : 1; で、普通にいけますね。 いずれにしろ、?:を使うのが手っ取り早い方法でしょうか。

回答No.2

map好きな私としてはこんなのが浮かびます。 自分で書いてても、もうわけわかりませんけれど(笑) ($num) = map{$1 || '定数'} $str =~ /^([1-9][0-9]*)$/ || 0; #しかし、mapを使う意味が無い・・・(汗)

noname#37358
質問者

お礼

ご回答ありがとうございます。 むむ…、なかなか複雑ですね。 最後の'|| 0'は空リストが返ってmapが実行されないのを防ぐためですね。 面白い例で勉強になりました。

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

あんまり、Perlらしくはないかもしれませんが、条件演算子(?:)を使うとわりと短く出来ます。 -------------------------------------------------- ($num) = ($str =~ /^([1-9][0-9]*)$/) ? $1 : 1; --------------------------------------------------

参考URL:
http://www5a.biglobe.ne.jp/~n_rieko/perl/5.htm#5-6
noname#37358
質問者

お礼

ご回答ありがとうございます。 そういえば、?:がありましたね…。 すっかり忘れてました。 Perlらしくはないですが、普通はこれ使いますよね。

関連するQ&A