• ベストアンサー

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

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

  • Perl
  • 回答数2
  • ありがとう数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); とか書くことになるんじゃないでしょうか。

kokucho81
質問者

補足

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ずつ増える、などというルールに従わないデータはこうして 列挙するしかないでしょう。実際には、このような数値を扱うときって ファイルから読みこんだりするんでしょうけど、そのときにも普通 整数に丸め込まれたりはしませんよね。 あくまでも演算子..のはたらきによって丸められてしまうのです。 # いや、コメントを書け、と言われたので変だなあと思いながらとりあえず…。

kokucho81
質問者

補足

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

関連する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.

  • 数1の範囲で2つ質問があります

    数1の範囲で2つ質問があります。 1、2の0乗 や 3の0乗など、0乗の数はすべて値は0になるのですか? 2、1/2-√3(2マイナスルート3分の1)の整数部分と少数部分の求め方がわかりません。とき方と答えを教えてください よろしくおねがいします!

  • 任意多倍長整数演算の問題

    任意多倍長整数演算を行う。 int f1 ( int x , y ) { if (x == 1 ) return ( x + y ); return ( f1 ( x - 2 , y - 1 ) * 2 ); } 1) f1の停止する範囲を求め、その範囲で停止することを証明せよ。 2) 1)の範囲で、f1 ( x 、y ) の値をx、yと整数定数を元にして四則演算を用いた式で表せるか。具体的にあらわしてそれが正しいことを示すか、表せないことを示せ。 以上の問題が解けません。 どなたか、解答方法などを教えていただけないでしょうか。

  • perlのリストと配列の違いについて

    Perlの本を読んでいたらリストというのがでてきました。 読んでいてもリストと配列の違いがよくわかりません。 リストと配列はどう違っていてどのように使いわけるのでしょうか?

    • ベストアンサー
    • Perl
  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

    • ベストアンサー
    • Perl
  • intの挙動?

    Perlのintをつかって整数化をしているのですが、すこし挙動がおかしいというか 正確な数値が出ませんので質問させていただきました。 $aaa = 21000*0.7; $aaa = int($aaa); print $aaa; 結果:14699 となります。 21000×0.7は14700のはずかと思いますが、なぜか14699になってしまいます。 どう考えてもわからなくなってきました。 どなたかご教授いただけませんでしょうか?

    • ベストアンサー
    • Perl
  • ビットマップ画像の座標を小数で扱う方法について。

    ビットマップ画像の座標を小数で扱う方法について。 プログラムでビットマップ画像を扱っています。 現在、ビットマップ画像のRGBの値を2次元配列に格納しています。 そのため、例えば画像の白い部分の座標がどこかを知りたいときは、2次元配列の場所を辿り、整数値として座標を得ています。 これを整数値ではなく、少数値で扱うことは可能でしょうか? 配列で扱う以外に方法が思いつかないです;; よろしくお願いします。

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

    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
  • ビット演算子を使った処理について

    ビット演算子を使ってビットの内容を変更する処理を教えてください。 プログラムは作ってみたのですが、思い通りの動きをしてくれません。 何かアドバイスをいただけないでしょうか。 #include <stdio.h> int main(void) { int num1 = 0x100000; int k = 0; int cnt = 0; int resval = 0; int cntlvmin = 0; int cntlvmax = 0; int levmin[6]; /* レベル最小値 */ int levmax[6]; /* レベル最大値 */ for(k=0;k<6;k++){ levmin[k] = 30+k*10; levmax[k] = 40+k*10; } /*判定値の設定*/ resval = 67; /* レベル別の範囲判定 */ for(cnt=0;cnt<6;cnt++){ cntlvmin = levmin[cnt]; cntlvmax = levmax[cnt]; /* ビット配列の設定 */ if(val< cntlvmin || cntlvmax<val){ /* 範囲外の場合、右に1つずらす */ num1 = num1 >> 1; } else { break; } } } やりたいことは、ある値(val)が、cntlvmin/cntlvmaxの範囲外の値の場合、num1の値(100000)を右シフトして、(010000)と右へ1つずつずらす。範囲内の場合には処理を終了するといったことです。 よろしくおねがいします。