• ベストアンサー
  • 困ってます

範囲演算子(..)での少数の扱いについて、

みなさまこんにちわ。 Perl未熟者 kokucho81です。 範囲演算子で、 @_=(0.5..3.5); とやって、 print @_; とやると、勝手に整数になっているのですけど。。。 なんで? わたしの持っている全ての参考書には、 最初の値から1づつ増やしていって、最後の値を超えない値までのリスト値を持つ、 という趣旨はかいてありますが、勝手に整数に丸めるなどと書いてある本はないのですが・・・ こういう感じで少数を配列で持つときは、どうエレガントに持てばよいのでしょうか? どうもあちこちPerlの挙動がわからんです。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数93
  • ありがとう数0

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

  • ベストアンサー
  • 回答No.1

確かにperldoc perlopでも整数にまるめることは書いてありませんね。 ただ、「it returns an array of values counting (up by ones)」 countingとなっていて、数え上げのための演算子であることは ほのめかされています。配列の添え字に使うと便利だよ、ともあります。 配列の添え字も整数に丸められますね。 @A = ('a', 'b', 'c'); print $A[1.5], "\n"; の結果はb、すなわち$A[1]といっしょになります。 配列の添え字に使うたぐいはみな整数にまとめられると覚えるしか ないように思います。範囲演算子の「範囲」とは、実数空間での 範囲ではなく、配列内の範囲と思ったほうがいいんじゃないでしょうか。 例えば 0.5, 1.5, 2.5 ...99.5を生成したいのでしたら、いろいろ 書き方はあるでしょうが例えば for (0 .. 99) { push(@_, $_+0.5); } とか @_ = map {$_ + 0.5} (0 .. 99); とか、 $a = 0.5; push(@_, $a++) while ($a < 100); とか書くことになるんじゃないでしょうか。

共感・感謝の気持ちを伝えよう!

質問者からの補足

Head_Syndicateさん、こんにちわ。 さっそくのご返答ありがとうございます! ゴールデンウィークも最後の日ですね~。 さて、、、 やはり理屈抜きで、素直に、「( )のリストは整数のリストになる」と 覚えてしまった方がよさそうでしょうか。。。             ・             ・             ・ 私もいままでは制御構造でぐるぐる回してやっていましたが、いまいちで… (2) @_ = map {$_ + 0.5} (0 .. 99); これいいですね。 ところで、Head_Syndicateさん。 自己紹介のコメント面白かったです(^ ^;)

その他の回答 (1)

  • 回答No.2

最後ですねえ。結局なにもせずに終わった…。 ひとつ気になったところが。 > 「( )のリストは整数のリストになる」 きっと書き間違いでしょうけど、これは違いますね。 @A = (0.123, 0.4, 1.2, 3.1111); print join(',', @A), "\n"; 別に整数に丸め込まれることはありません。 0.5から1ずつ増える、などというルールに従わないデータはこうして 列挙するしかないでしょう。実際には、このような数値を扱うときって ファイルから読みこんだりするんでしょうけど、そのときにも普通 整数に丸め込まれたりはしませんよね。 あくまでも演算子..のはたらきによって丸められてしまうのです。 # いや、コメントを書け、と言われたので変だなあと思いながらとりあえず…。

共感・感謝の気持ちを伝えよう!

質問者からの補足

> 「( )のリストは整数のリストになる」 そ、そうですね、おっしゃる通りで、これでは意味が違っちゃって ( )が丸めているような意味になってしまってますね... (今回とりあげた( )中のような..演算子のリストは整数のリストに なるという意味だったのですが、実はわたしも 補足 したあと、 「あっ(= =;) あ~ まじったかな」っとは思ってたのです...) 「..」の範囲演算子でのリストでは~ とすべきでした。 たびたびありがとうございました! >結局なにもせずに終わった…。 そ、そうですか。。 (πーπ) (でも、似たものみっけて ホ♪)

関連するQ&A

  • perl 条件演算子 範囲演算子についてです

    演算子 条件演算子 条件演算子 ?: は条件式の値により、2者のうちのどちらかを選択します。 $a=($x<10)?10:20; 変数$aの値が$x<10という条件において、真であれば:左側の10を選び、偽であれば:右側の20を選ぶ。 $a=10; 変数$aに10を代入する。 $a==5?print "5です。\n":print "5ではありません。\n"; 条件式でaが5であれば:左側の print "5です。\n"を表示します。 条件式でaが5でなければ:右側の print "5ではありません。\n"を表示します。 $a==10?print "10です。\n":print "10ではありません。\n"; 条件式でaが10であれば:左側の "10です。\n" を表示します。 条件式でaが10でなければ:右側の "10ではありません。\n" を表示します。 範囲演算子 範囲演算子 .. は、左側の値から右側の値まで、1つずつ増やした値の集まりです。 値には、半角英数字の数値または文字列が指定できる。 print 3..5; 3 4 5 と表示する。 一応、訳を下に書いたのですが合っていますでしょうか。

  • Perlのリファレンスとアロー演算子について

    Perlの勉強をしています. リファレンスとアロー演算子について教えて下さい. ■質問 下記のうち,(4)がどのように評価されるか教えて下さい. 先頭のシャープはプロンプトです. (1) よくある配列要素の指定方法 # perl -e '@a = (0,1,2,3); print($a[1]);' →1 (2) あまりよろしくないが,スライスを使っても,print文では@a[1]がリストのコンテキストで評価されるので同じ結果にはなる # perl -e '@a = (0,1,2,3); print(@a[1]);' →1 (3) よくあるリファレンス/デリファレンスの方法 # perl -e '$a = [0,1,2,3]; print($a->[1]);' →1 (4) 下記が成り立つ意味が分からない # perl -e '@a = (0,1,2,3); print(@a->[1]);' →1 @aは配列であってリファレンスでは無いと思うのですが,配列にアロー演算子が使えてしまっていいんでしょうか? Perl5のマニュアルによれば(http://www.namazu.org/~tsuchiya/perl/info/perl-ja_20.html),アロー演算子は「右側が [...] か {...} の形の添字であれば、左側は配列かハッシュへのハードリファレンスかシンボリックリファレンス」と書かれているので,左側が配列そのものであるときは,エラーになるのではないかと思うのですが... 分かる方,どなたかご教授いただければ幸いです. ■環境 # perl -v This is perl, v5.10.1 (*) built for i686-cygwin-thread-multi-64int (with 13 registered patches, see perl -V for more detail) Copyright 1987-2009, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.

  • 算術演算子にて、整数での除算処理は商になる?

    JAVAのプログラミングを勉強しているのですが、JAVAの算術演算子にて、 参考書に「除算演算子は割り算を行うものだが、整数同士の割り算を用いると「商」を計算する」と書かれているのですが、これはどういう意味でしょうか? 整数同士の割り算をすると、小数点ではなく四捨五入をした整数値が出力されるのでしょうか?

    • ベストアンサー
    • Java
  • 比較演算子===と!==について

    PHP初心者です。 まず、===と!==が型が同じかどうかを比較する演算子だという事は調べて分かりました。 問題は以下のソースコードに関してです。 <?php class foo { public $a = 3; } class hoge { public $a = 3; } //真偽を文字列に変換する関数 function trueOrFalse($comp) { return $comp? 'true':'false'; } //4つの比較演算子を用いた比較の結果の表示 function compareObject($var1, $var2) { print('$var1 == $var2 --'.trueOrFalse($var1 == $var2)."\n"); print('$var1 != $var2 --'.trueOrFalse($var1 != $var2)."\n"); print('$var1 === $var2 --'.trueOrFalse($var1 === $var2)."\n"); print('$var1 !== $var2 --'.trueOrFalse($var1 !== $var2)."\n"); } //オブジェクトの生成 $f0 = new foo(); $f1 = new foo(); //$f0を代入、$f2は、$f0と同じオブジェクトを指す $f2 = $f0; $h0 = new hoge(); //結果の表示 print("同じクラス、プロパティが同じ\n"); compareObject($f0, $f1); print("同じオブジェクトを参照\n"); compareObject($f0, $f2); print("異なるクラス、プロパティは同じ\n"); compareObject($f0, $h0); ?> この結果分からないのは$f0と$f1の比較で===はfalseに!==はtrueになる事です。 型が違うとは一体どういう事なのでしょうか。 また、付け足す形になりますが、$f0と$h0の比較についても分かりません。 値は両方3です。 なのに==はfalseに!=はtrueになります。 これはどうしてでしょうか。 アドバイスどうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • C言語のsizeof(サイズオブ)演算子について

    はじめまして。 C言語の初学者です。 sizeof(サイズオブ)演算子の理解でつまづいています。 参考書の説明は下記の通りです。 要素数を数えるのは面倒くさいので、要素数を自動的に求めて繰り返させることにします。 要素数を求める直接的な方法は用意されていませんが、計算することは出来ます。 配列全体のサイズを求め、それを要素1つのサイズで割れば要素の数がわかります。 C言語には、変数や配列のサイズを求めるsizeof(サイズオブ)演算子があります。 sizeof演算子は、次のようにして使います。 sizeof(変数や配列名) sizeof演算子には()をつけなくても良いのですが、つけた方が読みやすいでしょう。 この演算子を使って配列arrayの要素数を求めるには次のようにします。 sizeof(array) / sizeof(array[0]) 上記の説明文にある、【配列全体のサイズ】と【要素1つのサイズ】の【サイズ】とは何を指しているのでしょうか。 また、上記の【sizeof(array) / sizeof(array[0])】の割り算の意味が分かりません。 下記のプログラムを例にして、具体的に何を何で割っているのか数字を当てはめて教えてください。 よろしくお願い致します。 #include <stdio.h> int main(void) { int array[] = {42,79,13,75,19}; int i; for (i = 0;i < sizeof(array) / sizeof(array[0]);i++) { printf("array[%d] = %d\n",i,array[i]); } return 0; } このプログラムの実行結果は次の通りになります。 array[0] = 42 array[1] = 79 array[2] = 13 array[3] = 75 array[4] = 19

  • ダイアモンド演算子<>に対するbinmodeについて

    お世話になります。 ActivePerlでは、UNIXのPerlとの互換性を持たせるために、Windows改行\r\n(0x0d0a)を読み込んだら\n(0x0a)を読み込んだように、\n(0x0a)を書き出したら\r\n(0x0d0a)を書き出したように動作します。 この動作を抑制するためには、binmodeを使います。 ところが、 binmode STDOUT; のように行うと、確かに標準出力で普通に\nを出力すると、0x0aが出力されるのですが、<>(ダイアモンド演算子)に関しては、なんと言うファイルハンドルにbinmodeを使っていいかわかりません。 どうすればいいでしょうか。 具体的にいうと、以下のようなファイルをダンプするプログラムで、現状では0d0aが0aと表示されます。 #! perl #fileDump.pl while (<>) { for (split //) { print unpack "H2", $_; } } PerlのマニュアルによるとARGVというファイルハンドルを使っているという話がありましたが、 binmode ARGV; ではダメでした。 どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • 置換演算子についての疑問

    お世話になっております。horagaiです。質問160286 http://oshiete1.goo.ne.jp/kotaeru.php3?q=160286 と同じようなことをやりたかったので回答#2のやり方を 試してみました。そこでいろいろ疑問が出てきたので教えていただきたいと思います。 (1) $num=<> ; while($num =~ s/(.*\d)(\d\d\d)/$1,$2/g){;} print "num=$num\n"; とするとたしかにうまくいくのですが、これでうまくいく理由がわかりません。 置換演算子が後ろからパターンマッチをしていくのだとすればわかるのですが。 前からだとするとたとえば123456は最初に(1)(234)56で引っかかって1,23456 。 次に (1,2)(345)6 で引っかかって1,2,3456 ・・・。 などとなりそうな気がします。 (2) またwhileを使わずに $num =~ s/(.*\d)(\d\d\d)/$1,$2/g; としてみると 例えば入力が 12345678 とすると num=12345,678 と最初の3桁しか区切ってくれません。マニュアルを見ると 「gオプションは出現したパターンをすべて置換する。」 と書いてあるのにどうしてでしょう。 前からマッチするせよ後ろからマッチするにせよカンマが1つしか 入らないということはないと思うのですが。 以上、私が根本的な勘違いをしているかも知れませんので その辺のところもご指摘いただければ幸いです。 ちなみにOSはLinux.Perlのバージョンは5.004です。

    • ベストアンサー
    • Perl
  • matlabでのコロン演算子を用いた処理

    matlabを用いて音声処理のプログラミングを行っています handles.y(handles.sS : handles.sE) = 0; %指定区間を無音に置き換え handles.sS = 1;%無音部の開始位置1 handles.sE = (handles.sT * handles.Fs);%無音部の終了位置を計算 handles.sT = 0; %無音部の初期値0 handles.Fs = 44100; %サンプリング周波数44100Hz 上のような処理で正弦波handles.yの指定区間を無音に置換し handles.sT = handles.sT - (1/handles.f * 1/72); %無音部の値を5°分減少 上のような処理で無音時間の長さを操作しています しかし再生を行うと コロン演算子をインデックスとして使う場合、整数オペランドが必要です という警告が出てきてしまいます。コロン演算子のオペランドを整数にしたいのですが、うまい処理が思いつきません。 なにか方法があればご教授お願いします。

  • 文字を整数として扱う場合の演算について質問

    javaの参考書に、文字を整数として扱う場合の演算についての解説があり、疑問点があったので質問します。 質問1:何故char型の変数は、キャストしなくてもint型のリテラルを代入することができるのか?      例えば、 以下の演算はキャストしなくてもこのまま代入できます。 char ch='a'; ch=98; でも、以下の演算はキャストしていないのでエラーになります。      char ch='a'; ch=ch+1; これは何故ですか?参考書に記載されていた理由として、「byte,char,short、 これ等の型の変数や値を使って計算すると、それ等は一度intに直して計算されるから」というような趣旨の事が書いてありました。 つまり、char型の変数には、キャストしない限りint型の数値を代入できないということですよね? でも前者のソースコードは、chはchar型であるにもかかわらず、int型のリテラル98を代入できています。 これは何故ですか? 質問2:javaの参考書に、インクリメント・デクリメント演算子と複合代入演算子は、型を保存するという解説がありました。これはどういう意味ですか? 僕の仮説では、例えば、      char ch='a';      ch+=5; であれば、5は、char型のまま代入されるということでしょうか?

    • ベストアンサー
    • Java
  • new演算子でメモリを確保したが、値が格納されなかった配列の…

    new演算子でメモリを確保したが、 値が格納されなかった配列の判別方法は ありますでしょうか? int i; int* a; a = new int[5]; a[0] = 0; a[1] = 1; a[5] = 5; //0,1,5のみ表示させたい for (i = 0; i < 6; i++) { if (?????) cout << a[i] << endl; }