- ベストアンサー
コンテキストについて
パターンマッチを用いて、変数$numに、文字列$strが正の整数の場合はその値を代入し、そうでない場合はデフォルト値として定数を代入したいのですが、 ($num) = ($str =~ /^([1-9][0-9]*)$/) || 1; としても、正の整数としてマッチした場合でも、||の影響で||の左辺がスカラーコンテキストとして評価され、真値としての1が代入されて上手くいきません。 上記の用件を1行で満たすPerlらしいスクリプトがあったら是非教えてください。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
パターンマッチに失敗した場合は空リストが返るので、これを利用する手があります。 ($num) = ($str =~ /^([1-9][0-9]*)$/, 1); 分かりにくいので、私なら絶対こんな書き方しませんが^^;
その他の回答 (3)
- estea
- ベストアンサー率44% (39/87)
$num = ($str eq $str + 0) ? $str : 1; こんなんでだめかいな。 正規表現って苦手なもので...
お礼
ご回答ありがとうございます。 この場合、負の整数でも値が返ってしまいますね。 ふと思ったのですが、 $num = ($str > 0) ? $str : 1; で、普通にいけますね。 いずれにしろ、?:を使うのが手っ取り早い方法でしょうか。
- natsuki_tk
- ベストアンサー率35% (99/279)
map好きな私としてはこんなのが浮かびます。 自分で書いてても、もうわけわかりませんけれど(笑) ($num) = map{$1 || '定数'} $str =~ /^([1-9][0-9]*)$/ || 0; #しかし、mapを使う意味が無い・・・(汗)
お礼
ご回答ありがとうございます。 むむ…、なかなか複雑ですね。 最後の'|| 0'は空リストが返ってmapが実行されないのを防ぐためですね。 面白い例で勉強になりました。
- root139
- ベストアンサー率60% (488/809)
あんまり、Perlらしくはないかもしれませんが、条件演算子(?:)を使うとわりと短く出来ます。 -------------------------------------------------- ($num) = ($str =~ /^([1-9][0-9]*)$/) ? $1 : 1; --------------------------------------------------
お礼
ご回答ありがとうございます。 そういえば、?:がありましたね…。 すっかり忘れてました。 Perlらしくはないですが、普通はこれ使いますよね。
お礼
ご回答ありがとうございます。 おお、この例は個人的につぼに入りました。(笑 確かに分かりにくいですが、Perlらしさが出てて面白いですね。簡潔ですし。 マスターポイント発行させていただきます。