• ベストアンサー

コンテキストについて

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

noname#37358
noname#37358
  • Perl
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • 初歩的な質問ですが、どなたかアドバイスお願いいたします。

    初歩的な質問ですが、どなたかアドバイスお願いいたします。 演算子(+、-)などを、文字列に代入し整数と連結しても、演算子として扱えないのでしょうか? 複数の演算子を入れ替えて使用したいので、変数へ代入して使用したいのですが・・・・ 例) $sig = '+'; $num = 1; $num2 = 2; $str = $num. $sig. $num2; if ( $str == 3 ){ echo"OK"; } else { echo"NG"; } 上記、例だと「NG」が出力されてしまいます。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Perl ハッシュの値のリストをスカラーコンテキストで評価すると?

    こんにちわ。 初めての利用です。 Perlの事で質問なのですが、 my $score=($hash{"fred"},$hash{"barney"},$hash{"wilma"}); とすると$scoreにはキー「wilma」に対応した値が代入される様です。 リスト形式をスカラーコンテキストで評価すると、リストの要素数を返すと記憶していたので、この場合$scoreには3が代入されると思っていたのですが・・・。 試しに my @scores=($hash{"fred"},$hash{"barney"},$hash{"wilma"}); $score=@score; とすると$scoreに3が代入された様です。 この二つの式では一体何が違うのでしょう・・・?

    • ベストアンサー
    • Perl
  • リストの最後の要素がリストリテラルの値になる?

    上級ウィザードを目指してプログラミングPerlを読んでいます! 53ページのリスト値の説明によると スカラーコンテキストでは、リストの最後の要素の値がリストリテラルの値になる。 とあり $stuff = ("one", "two", "three"); では、threeだけが変数$stuffに代入される。 とあります。 しかし、このコードを実際に試してみると $stuffにはoneが代入されました。 この本の記述が誤っているのでしょうか。 それとも私のやり方が何か間違っているのでしょうか。 誰か教えてください。

    • ベストアンサー
    • Perl
  • 引数別の例外処理

    (1)コマンドラインの1つ目の引数を整数に変換して、int型の変数num1に代入。 (2)コマンドラインの2つ目の引数を整数に変換して、int型の変数num2に代入。 (3)num1とnum2の掛け算結果を標準出力。 (4)例外「NumberFormatException」が発生した場合は、“○(引数の例外発生した方の値)は整数に変換できません”の文字列を標準出力し、プログラム終了。 という問題で、NumberFormatException の○の部分の表示の仕方を教えて下さい。

    • ベストアンサー
    • Java
  • evalの使い方 引数として式を与える

    引数として与えた式を、プログラム中で計算するようにしたいと思っています。 引数に変数を入れることはできないのでしょうか? 将来的には、ファイルを開いてそれぞれの、ファイルごとの定数を式に代入しようと考えています。 よろしくお願いします。 プログラム ################################### my $bb =2; my $str = $ARGV[0]; eval $str; print "$str\n"; 実行文 #################################### perl test.pl 2*3+\$bb 結果 #################################### 2*3+$bb 望んでいる結果 8

    • ベストアンサー
    • Perl
  • 外部テキストの値を得るには?

    フラッシュ初心者&質問するのが初めてなので うまく伝わるかどうか心配ですがよろしくお願いいたします。 外部テキストnum.txtにはstr=5という記述があります。 このnum.txtを取り込んで、 5という数値をflash側で変数aaaに代入しました。 --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; trace(aaa); } } --------------------------- この場合、ちゃんと5と出力されます。 しかしこの関数内のaaaという変数を他でも利用したいのです。 (例えばvar menu_num:Number = aaa;というように) 単純に下のように記述すると --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; } } var menu_num:Number = aaa; trace(menu_num); --------------------------- undefinedが出力されます。 この時にちゃんと5と出力させるにはどうしたらいいのでしょうか。 いろいろグローバル変数など勉強しましたがうまくいきません。 ちなみに外部テキストnum.txtのstr=5というのは、 5という数字のみでもかまいません。 とにかくテキストから数値を取り出す方法を考えています。 ご回答お願いいたします。

    • ベストアンサー
    • Flash
  • JA

    PERLの中にJAVESCRIPTがあり、PERLの共通変数を呼びたい。どうしたらよいですか?${STR_CHANGEPASSWD_CHEC}と${STR_HALF_WIDTH_CHECK};を読みたい。 <script type="text/javascript" language="JavaScript"> <!-- function input_check(){ var num = document.f1.pwd_man.value; if (num != "") { if(!isNaN(num)){ alert(" . ${STR_HALF_WIDTH_CHECK}; . "); return; } } if(! confirm(" . ${STR_CHANGEPASSWD_CHEC} . ")){return;} move(); } //--> </script>

  • rubyにおける変数と代入のメモリの様子について

    Rubyの変数と代入演算は、メモリについてどのような扱いになっているのでしょうか。2点ほど疑問電があります。 1点目:代入演算は変数にアドレスを渡しているのか RubyLifeのRuby入門のサンプルをみて学習していたところ疑問がわきました。 http://www.rubylife.jp/ini/var/index4.html を参照しながら示します。 str1 = "Tokyo" str2 = str1 str1 << ",Japan" とやるとstr1もstr2も"Tokyo,Japan"となることから、rubyでの代入演算はアドレスを代入してると考えました。 2点目:新しくオブジェクトを代入すると別メモリ領域において、そのアドレスを代入しているのか str1 = "Tokyo" str2 = str1 str1 = "Osaka" とやると、str1は"Osaka"、str2は"Tokyo"となります。 前述の参照渡と考えるとstr2も"Osaka"となっているはずですが違いました。 ここで解説に(引用はじめ) なお2つの変数が同じオブジェクトを指し示した後で、どちらかのオブジェクトに新しいオブジェクトを 代入した場合は、代入された変数が指し示すオブジェクトだけが変更されるだけです。(引用おわり) とあります。 このことをふまえると、新しいオブジェクトを変数に代入するというのは、別のメモリ領域をつくってデータを置いてから、そのアドレスを変数に代入している、と考えました。 これら2つの考えと実際の仕組みは一致しているのでしょうか、と言うのが質問です。 質問点をまとめると、Rubyにおいて変数に対して ・代入演算はアドレスを代入しているのか(Cでいうポインタの扱いなのか) ・新しいオブジェクトを代入するときには、新メモリ領域を作ってデータを入れてそのアドレスを代入しているのか という点です。 ついこの間はじめたばかりの初心者ですが、どうかご教授よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 変数に格納できる桁数に制限はあるの?

    スカラー変数に格納できる桁数に制限はあるのでしょうか? 制限があるとすれば、どうすれば解除できるのでしょうか? 具体的には下記のような手順です。 小数15位まである数値(整数部は3桁)を変数($hoge)に代入する。 $hoge = 123.123456789012345; 次に、この変数を他の変数($fuga)に代入する。 $fuga = $hoge; さらにこの変数をSmarthに渡してブラウザに表示させると、小数点以下が12桁までしか表示されません。 どうすれば15桁をそのまま表示させることができるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字列について

    適当な文字列をキーボードから入力し、次に別の適当な整数numをキーボードから入力する。次に先に入力した文字列のnum番目からnum個の文字だけ逆順になるように文字列を並び替えた文字列を新たな文字列変数に代入し、その結果を画面に出力するプログラムを下記で作成したのですが、文字列時代が逆になってしまいます。どうしたら、 結果    文字列を入力      My name is Taro Sandai.    整数を入力     10    My name isdnaS oraT になるのですか? import java.io.*; class mojiretu4 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("整数を入力"); String str2 = br.readLine(); int num = Integer.parseInt(str2); StringBuffer sb = new StringBuffer(str1); sb.reverse(); System.out.println(sb);

    • ベストアンサー
    • Java

専門家に質問してみよう