X



Perlについての質問箱 64箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/02/01(金) 09:44:37.18ID:1/Kr4Qjk
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板: https://medaka.5ch.net/php/

このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
荒らしはスルー推奨。

"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、
Perlの奥深さについて皆で語り合い、追求してまいりましょう。

www.perl.org/get.html
Download Latest Stable Source (5.28.1)

▼前スレ
Perlについての質問箱 61箱目
http://toro.5ch.net/test/read.cgi/tech/1381561905/
Perlについての質問箱 62箱目
http://toro.5ch.net/test/read.cgi/tech/1385039352/
Perlについての質問箱 63箱目
https://mevius.5ch.net/test/read.cgi/tech/1392820583/
0024デフォルトの名無しさん
垢版 |
2019/02/26(火) 20:51:34.33ID:vB+znWqX
>>23
ほぼない
けどWeb制作板に行くとエンコードどころか文字コードも理解してなかったから絶対回答こない
0025デフォルトの名無しさん
垢版 |
2019/02/26(火) 21:02:05.63ID:c2o2e7e/
どうしてもすぐになんとかしたいなら全てをUTF8にする。
0026デフォルトの名無しさん
垢版 |
2019/02/26(火) 21:32:12.63ID:tHWhBgwU
ほんとにcp932なのか?
実はUTF-8で出力されてて、ヘッダはただ無視されてたりしないのか?

まず、クライアントでデータを保存して、バイナリエディタで確認してみたら?
0027デフォルトの名無しさん
垢版 |
2019/02/26(火) 22:01:28.20ID:DhIH/rsp
そのような不正な URL がどのように扱われるかを問うのはあまり有意義とは思えない。
適切に扱ってほしいなら適切にエンコードするしかないと思うのだが。
HTML::Element とか URI を使えば簡単だよ。
0028デフォルトの名無しさん
垢版 |
2019/02/27(水) 00:05:17.07ID:7T/MRSXz
>>26
ほんとにcp932
なのにutf8でエンコードされる
>>27
cgiは、どっかにあるHTMLが書いてあるテキストファイルを読み込んで出力してるだけだから、<IMG SRC="あいうえお.jpg">のあいうえおの部分を見つけ出してエンコードするのは無理がある。
さらにエンコード下として、それをデコードしてパスを通すhttpdと通さないhttpdがあるようなので仕様を知りたい
0029デフォルトの名無しさん
垢版 |
2019/02/27(水) 02:26:58.26ID:Hcodp8Vt
ホントにそうなら、やっぱブラウザのせいなんかね。
データをデコードしたテキストをそのままURLにしたら、たしかにそうなりそうな気はする。

どうしてもあちこちいじらずに簡単に対処するなら、サーバーのほうはどう?
プロキシとかRewriteとか使って、とにかくURLを受けてしまってから、受けたURLを動的に解釈したら?
0030デフォルトの名無しさん
垢版 |
2019/02/27(水) 03:01:51.84ID:7T/MRSXz
>>29
もうcp932のファイル名はやめて全部アルファベットにしようと思うのだが、
Rewriteってなんだろう
アニメが出てきたんだが

まあおまえらありがとうな
utf8ならまだしもcp932のファイル名をそのまま使おうとした俺が悪かったんだよきっと
でもwindowsがcp932のファイル名だからしょうがないんだよ
0031デフォルトの名無しさん
垢版 |
2019/02/27(水) 09:17:13.93ID:MitD/HmJ
>>20
ブラウザがUTF-8 と解釈するのは、HTML のheader に、言語の指定をしていないからじゃないの?
ただし、sjis を指定しても、そのPC がsjis に対応していないかも?

>>22
>運用環境(有料で借りてる)のApacheさんはパスを、URLデコードしてる模様
URLデコードするかどうかを、設定ファイルで指定できないの?

>>30
web 系は、すべてのファイルを、BOM 無しUTF-8(UTF-8N)に統一すべき!
他の言語を使うと、PC・スマホがその言語に対応していない場合に、バグる
003331
垢版 |
2019/02/27(水) 12:43:30.58ID:MitD/HmJ
漏れは、web 系の本を、軽く数十冊は読んでるけど、
sjis のファイルを使う本は、見たことがない

それに、パス・ファイル名などのシステムの構成物に、全角を使う本も見たことがない。
パス・ファイル名は、ファイル内容のテキストじゃない。
あくまでもシステムの構成物だから、半角英数字が基本

Linux・Windows 共用のパス・ファイル名には、半角英数字と、_ (アンダーバー)だけを使う。
半角空白もバグるので、すごく嫌われる

さらに、大文字小文字だけが異なる、パス・ファイル名も使ってはいけない。
例えば、Ab, aB がLinuxでは使えるけど、Windowsでは共存できないから

だから、このシステムは、sjis・全角の2つを使う、違反を起こしている!
こういうやり方を書いた本は、絶対に無いはず

sjis を使っているのは、ロートルの5ch ぐらいw
だから少しでも、5chのシステムをいじるとバグるから、システムを修正できない!
0034デフォルトの名無しさん
垢版 |
2019/02/27(水) 13:14:56.19ID:FWLYBGBg
>>30
「RewriteRule」。
# 「httpd」とかいうから、Apacheに詳しいんかと思ってた。

要はとにかく、サーバーがURLを受けてから、それをランタイムで変換して実際のアクセス先を決めることはできるはず、という提案。
0035デフォルトの名無しさん
垢版 |
2019/02/27(水) 13:19:18.71ID:FWLYBGBg
>>31
URLデコードを禁止できるか?
URLの仕様なのに。
それに、もししたとしたら、CGIの引数とかどうなるんだ?
0036デフォルトの名無しさん
垢版 |
2019/02/27(水) 14:29:50.58ID:7T/MRSXz
>言語の指定をしていないからじゃないの?
してる

>$print_code .= q[Content-Type: text/html;charset=Shift_JIS] . qq[\n];
>$print_code .= q[<META http-equiv="content-type" charset="Shift_JIS">];

>URLデコードするかどうかを、設定ファイルで指定できないの?
金払って借りてるマシンなのでたぶん無理なんじゃね?
いやApacheさんの使い方とか仕様とか全然知らないから知らんけど

>UTF-8(UTF-8N)に統一すべき!
cgiが古いんだよ
作り直したいけど簡単そうじゃないので放置してる
気持ち的には全部utf8にしたい

>>34
俺のサーバーじゃないけどそんなこと出来るのか?
003731
垢版 |
2019/02/27(水) 15:05:26.60ID:MitD/HmJ
>>36
>$print_code .= q[Content-Type: text/html;charset=Shift_JIS] . qq[\n];
>$print_code .= q[<META http-equiv="content-type" charset="Shift_JIS">];

「html sjis meta」で検索すると、以下が見つかる。
上とは、ちょっと違う

<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

他には、PHP で作ったそのファイルが、UTF-8 で保存されているとか?

「html sjis 文字化け」で検索すれば?

文字化けを防ぐ&解消する方法
https://www.be-webdesigner.com/tips/coding/mojibake.htm
0038デフォルトの名無しさん
垢版 |
2019/02/27(水) 20:57:58.02ID:Hcodp8Vt
>>36
レンサバでも、管理者だったらいろいろできる。
しかし、もしそうだったとしても、どうやらたぶんおまえにはムリぽなので、もうあきらめろん。
0039デフォルトの名無しさん
垢版 |
2019/03/02(土) 02:33:03.15ID:LJe83Rmr
>>20-21
ブラウザごとにURLエンコードは統一は取れてなかったと思うよ
まず開発環境としてANHTTPDの使用をやめることをお勧めする
IISかApacheをインストールして使った方がいいと思う
0040デフォルトの名無しさん
垢版 |
2019/03/04(月) 18:44:25.85ID:G/cMwSEz
https://lavender.5ch.net/test/read.cgi/airline/1551189110/

このツールが使えない
誰か使い方を教えてくれ

ソースを拡張子.plにして保存、perl実行環境はインストール
ここまでは出来てる
ソースの改造の仕方が分からない
0041デフォルトの名無しさん
垢版 |
2019/03/04(月) 19:13:42.66ID:Y5viPS4k
連投ツールとか名前が穏やかじゃないから教えない
0042デフォルトの名無しさん
垢版 |
2019/03/04(月) 19:18:59.22ID:TpCWsYE8
今の5chではスクリプトによる連投はできないのでは?
試したことないのでわからんが。

しかしそのツールなんでわざわざforkして子プロセスに同じことさせてんだろ?その辺がワザなのか?よくわからんね。
0043デフォルトの名無しさん
垢版 |
2019/03/04(月) 20:43:15.61ID:q6ai/7VO
Perl は初めてかい? まず、Perl の勉強からだね。
何をするプログラムかは後回しにして、何が書かれているかを理解できるようになろう。
書かれていることを理解できるようになったら、使われているモジュールを理解しよう。
LWP を使ってみよう。勉強しなければならないことがたくさんあると気付くだろう。
最低でも HTTP の仕様書くらいは読まないと話にならない。
ここまでできれば最初のソースコードを理解して改造だってできるかも。
0044デフォルトの名無しさん
垢版 |
2019/03/04(月) 20:47:32.38ID:Y5viPS4k
彼はインストール方法を知りにきただけであってPerlを知りにきたわけではないだろう
0046デフォルトの名無しさん
垢版 |
2019/03/04(月) 21:19:56.49ID:W5B7ie4G
今の2ちゃんは決まったツールでしか投稿できない
0047デフォルトの名無しさん
垢版 |
2019/03/04(月) 23:55:42.18ID:TpCWsYE8
だよなあ。そのせいでお気に入りの専ブラ使えなくなったし。
0048デフォルトの名無しさん
垢版 |
2019/03/05(火) 15:13:16.59ID:opbbmC0J
もうC++/Qtで書く気がしない。
Perl/Qtで事足りる。
Perlの開発者が「PCの速度が上ればCである必要はないだろう」みたいな事言ってたけど、
まさにその通りだな。
0050デフォルトの名無しさん
垢版 |
2019/03/06(水) 21:27:34.75ID:USxtxcs5
なんかのはずみで処理が終わらなかったとき、自殺するようにしたいんだけど、

eval {

alarm 5;
$SIG{ALRM} = sub { exit; };

};

これでいいんだっけ?
0051デフォルトの名無しさん
垢版 |
2019/03/06(水) 21:55:14.52ID:/3I9LNWz
いいんじゃないすか それだけだとevalはいらないと思うけど
あと慣例ならハンドラ設定が先かな exitじゃなくdieとか
0052デフォルトの名無しさん
垢版 |
2019/03/06(水) 22:26:52.53ID:USxtxcs5
ありがとう

>evalはいらないと思うけど
よく覚えてないけど、evalはシグナルに対応してないシステムだとエラーで落ちる気がした
0055デフォルトの名無しさん
垢版 |
2019/04/29(月) 00:48:49.16ID:OgUfT4lW
メアド用にさくらインターネットのライトプラン(sslログインなし)借りてるんだけど
そこにちょっとしたcgi作って置こうとしてて
ものすごい久々にuse CGIとかやってます。

で、corelist CGIってやると
> Data for 2018-01-20
> CGI was first released with perl 5.004, deprecated (will be CPAN-only) in v5.19.7 and removed from v5.21.0
と出るんだけど

CGIが標準モジュールから削除された理由とか、
代替となるモジュールって知ってる人いませんか。

Perlはweb用の言語じゃないから標準モジュールからは消した とか
そんな理由ならいいんだけどさ。。
0056デフォルトの名無しさん
垢版 |
2019/04/29(月) 01:34:45.78ID:EAhXUlQz
「core は出来るだけ小さく」
「CGI はもはや Web の主流ではない」

かな。必要になった者のみが追加でインストールすればよい
標準で代替になるようなものはないと思うが pure perl だろうし最悪 CGI モジュールも一緒にアップロードとかでも動くでしょ

そもそもさくらレンタルサーバーで使える perl って 5.8 〜 5.14 ぽいけど
ttps://help.sakura.ad.jp/hc/ja/articles/206053142#ac05
0057デフォルトの名無しさん
垢版 |
2019/04/29(月) 01:57:14.83ID:OgUfT4lW
>>56
どもども
その理由なら安心ですわ
perlのバージョンは確認したんだけど、消えた理由によっちゃ使うの気持ち悪いなーと思ったので
どもでした。
0059デフォルトの名無しさん
垢版 |
2019/05/21(火) 21:00:16.28ID:BVi2WQ22
ていうかこんなに長くアップデートが続いていることだけでもかなり凄い事だと思う。
0061デフォルトの名無しさん
垢版 |
2019/06/01(土) 02:23:48.95ID:4bbBO9Ct
$str =~ /$pattern/
みたいなことはできるけど、
$str =~ /$pattern/$opt
みたいにして大文字小文字を同一視するかどうかを動的に指定したい
if文で処理行を分けるしか無理?
0062デフォルトの名無しさん
垢版 |
2019/06/01(土) 04:41:47.86ID:uuPo6pHP
>>61
eval 使えばいいのでは?
0063デフォルトの名無しさん
垢版 |
2019/06/01(土) 08:47:17.23ID:GQlgchjf
Ruby では、Regexp オブジェクトで、動的に作れる

str = "aB"
opt = Regexp::IGNORECASE

p re = Regexp.new( str, opt )
#=> /aB/i
0064デフォルトの名無しさん
垢版 |
2019/06/01(土) 10:32:32.69ID:uuPo6pHP
パターンマッチの直前で比較対象の文字列を uc() 使って小文字を全て大文字に変換しておく、または lc() で大文字を全て小文字にしておく事でも実現できるな。
パターンの方にも変換必要になるかも知れないが、それについては予め大文字または小文字でパターン作っておけば回避できる。
0067デフォルトの名無しさん
垢版 |
2019/06/01(土) 11:49:39.64ID:4bbBO9Ct
(?i)と書いておけばいいだけか
じゃあもう実装済みで、使う側でどうにでもできる
0069デフォルトの名無しさん
垢版 |
2019/06/13(木) 09:38:18.19ID:8EHJsjb3
Pythonはほどほどの長さのスクリプト言語としてならアリなんだが
ツールとしては良くも悪くも電卓だなぁ
0070デフォルトの名無しさん
垢版 |
2019/06/14(金) 01:28:05.42ID:TwyiKBjF
バッチは使いやすさでperl、サーバだと今はパフォーマンスで選んでgolangやろうとしてるわ
0073デフォルトの名無しさん
垢版 |
2019/06/16(日) 10:31:31.41ID:Q48cejx2
windowsでreaddirするとcp932で読めてくる

それだと面倒なので、opendirする時か、ハンドラに対して、
decoding(cp932) みたいに指定するにはどうすればいい?
0075perltidy バグってない?
垢版 |
2019/06/28(金) 03:27:32.11ID:yOZUOG90
perltidy -pbp -nola perl_file
この -pbp は perl best practices にする設定になっている
という仕様が書かれているが

sub {
:LABEL
for ....................

のようなラベルが本の通りにならない。たとえば 103ページなど
ラベル調整を諦めて -nola をつけ、手動で正しくすることにした

これバグだよな?
0082デフォルトの名無しさん
垢版 |
2019/06/29(土) 15:18:34.74ID:3U68S2mZ
一旦生で読んでcp932でデコードすればいいのか
LWP:Simpleだとそのへんに手が出せない
0083デフォルトの名無しさん
垢版 |
2019/06/29(土) 17:02:36.85ID:o1VtcfU0
MySQLもそうだけど、sjisは使っちゃイカンやろ。
細かいところで文字の置き換えルールがメチャクチャだったような。

いわゆるシフトJISはとにかくcp932で。
0085デフォルトの名無しさん
垢版 |
2019/07/06(土) 10:10:18.37ID:oMEfEQKE
元がeuc-jpだと、
$str =~ s/\x{301c}/〜/g;
みたいなことを明示的に書かないと、回避できないみたい
同じものやがな
0086デフォルトの名無しさん
垢版 |
2019/07/12(金) 02:22:50.96ID:AjCqo1Mf
下記のコードですがダブルクォートを介さずに$testから'フ'を表示させる方法はありますか?

#!/bin/env perl

use strict;

use warnings;
use utf8;

my $test = '\xE3\x83\x95';
my $test2 = "\xE3\x83\x95";

print "$test\n\n";
print "$test2\n\n";
008986
垢版 |
2019/07/12(金) 07:58:26.24ID:AjCqo1Mf
ありがとうございます!
0090デフォルトの名無しさん
垢版 |
2019/08/11(日) 05:06:35.55ID:GTeyRs5o
こんな書きかたあったか?
DB<27> printf "%s\n", ('Fizz')[$_%3] . ('Buzz')[$_%5] || $_ for (1..15)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz


()[]が見おぼえがない
0091デフォルトの名無しさん
垢版 |
2019/08/11(日) 05:17:44.88ID:GTeyRs5o
()で配列とみなしたとき
()[0]は定義されていると考えて
()[1]などは未定義で無しというトリックか
0092デフォルトの名無しさん
垢版 |
2019/08/11(日) 05:42:32.38ID:GTeyRs5o
DB<25> print "$_ cup", ("s")[$_ < 2] , " of coffee\n" for (1..3)
1 cup of coffee
2 cups of coffee
3 cups of coffee
0093デフォルトの名無しさん
垢版 |
2019/08/11(日) 10:17:48.54ID:GTeyRs5o
DB<23> printf "%s\n", "$_ cup" . ("s")x!!($_ != 1) . " of coffee" for (0..3)
0 cups of coffee
1 cup of coffee
2 cups of coffee
3 cups of coffee

DB<24> printf "%s\n", "$_ butterfl" . ("y","ies")[($_ != 1)] for (0..3)
0 butterflies
1 butterfly
2 butterflies
3 butterflies
0094デフォルトの名無しさん
垢版 |
2019/08/12(月) 10:00:54.45ID:1t9yEA1l
今はもう (1)[1] が空リストにならないんだな。perl5220delta に書いてあった。
リストコンテキストでの問題を避けるために
[split( /::/ , $class)]->[4]
みたいな書き方をしていたんだが。
いや、これは変えなくていいのか。
0095デフォルトの名無しさん
垢版 |
2019/08/12(月) 10:16:24.43ID:BBJuWfXI
undefは省力とかフェールセーフ的に有効にするんじゃなくて、
厳密に仕様化して積極的に使うべきだよな

初期化されてないものを使うのが気持ち悪いと感じるのは、
auto変数が本当に領域確保するだけだった頃の名残り
0096デフォルトの名無しさん
垢版 |
2019/09/14(土) 11:56:42.38ID:MMNKizJk
簡単なシェルスクリプトしか書けない素人ですがPerlの利点ってどこです?
grep -Pやperl -peで世話にはなっていますが目当てはあくまで正規表現だけですし
比較演算子はbashと逆だし変数は記号で使い分けなきゃならんしなんだこいつってなって
0098デフォルトの名無しさん
垢版 |
2019/09/14(土) 23:46:33.57ID:n7pzU9md
テキスト処理に特化されているところ
そのおかげで "," や " " とかの部分を q(,) q( ) などと書けたり
perl コードが正規表現と一体化していて再帰も扱えたりなど色々あるが
全部特化したことによる利点
0100デフォルトの名無しさん
垢版 |
2019/09/15(日) 00:02:41.49ID:epz106Yo
bashで凝ったことを書くことを考えたら、Perlのほうがはるかに簡単。
bashは所詮シェルなので、クォートとかエスケープとか変数とか関数とか、いちいちワナが多いからな。
0101デフォルトの名無しさん
垢版 |
2019/09/15(日) 17:56:28.72ID:riyG3w3b
Perlの利点?
他の言語と同様になんでもできることかな。モジュール色々使うと作るの楽だしOSの違いもかなり吸収されてWindowsでもLinuxでも何も変更せずに動くプログラムも作れる。

シェルスクリプトも外部コマンド動かせば何でもできるとは言えるが、起動のオーバーヘッドの問題や起動しているコマンドの仕様が変わったときに個別に対応しなければいけないなど面倒な事がある。
0102デフォルトの名無しさん
垢版 |
2019/10/23(水) 15:22:28.55ID:Q75cL8J3
>>101
> OSの違いもかなり吸収されてWindowsでもLinuxでも何も変更せずに動くプログラムも作れる。
これでとんでもない目に遭ったぞ。
perlの\nは、内部的にはLF のみだが、OSがWindowsなら、出力する際に
CR+LF に自動的に変換してくれる。
しかし、出力文字コードがutf16le だと、特殊な宣言文を書かない限り、
LF (0x000a)は 「0x000a000d」ではなく、「0x000a0d」に変換され、
ぐちゃぐちゃに文字化けする。

文字化けの原因を特定し、回避方法を見つけるために、ずいぶん時間を取られた。
0104デフォルトの名無しさん
垢版 |
2019/10/23(水) 17:37:45.28ID:azQS8Nqn
>>102
\n は他の言語でも気を付けた方が良い。
例えC言語だったとしても歴史的な事情でライブラリが勝手に変換するかも知れない。
この頃はそれにまつわるバグは減ってるとは思うけどね。

ま、少なくとも \n を \x0a だと信じ込んで使うのは止めた方がいいだろうな。
\x0a はあくまでも \x0a と書いた方が良い。
Javaとかでは改行は System.out.println() を使って改行させるようにして \n を埋め込んでの改行は極力避けた方が良い。
0105デフォルトの名無しさん
垢版 |
2019/10/24(木) 00:15:31.72ID:dNYiTPCj
>>102
いや、特殊な宣言文ってなんだよ。PerlIO の man 読めよ。
open 関数や binmode 関数の説明にも「PerlIO を読め」って書いてあるよ。
0107デフォルトの名無しさん
垢版 |
2019/10/24(木) 06:24:46.42ID:rCe9ez9s
\nを埋め込んだ箇所が一つでもあったらアウト
みたいな作り方は絶対失敗する
0109デフォルトの名無しさん
垢版 |
2019/10/24(木) 09:04:15.10ID:LjTGtkP8
>>105
> いや、特殊な宣言文ってなんだよ。PerlIO の man 読めよ。

結論としては、下のように書けばいいのだが、これはネットで色々探して
見つけてきたもので、PerlIO の man 読んで自分で見い出すことは、
私にはできなかった。それが出来る人は凄いと思う。

binmode STDOUT => ":raw:encoding(utf16le):crlf";
0111デフォルトの名無しさん
垢版 |
2019/11/06(水) 01:45:01.50ID:yvB3xxPc
消費税計算(10%)しようとしました。税込550円を消費税と本体価格にする。

$a = 550;
$b = 1.1;

$c = $a / $b;
$d = $a - $c;

$e = int($c);
$f = int ($d);

print すると、
$c は 500
$d は 50.000000000001(0の数はだいたい)

$e は 499
$d は 50

とうやら550 / 1.1 が内部的に割り切れていない様子(おそらく実際は内部的に499.99999999999999になってるのでintすると499に)

ロジックの変更で回避したけど、このバグ聞いたことありますか?
0112デフォルトの名無しさん
垢版 |
2019/11/06(水) 02:54:03.98ID:normnvJW
>>111
バグじゃなくて仕様やろ。
Perlの数値型はdoubleなので、1.1が正確に表現できてないんちゃう?
浮動小数点数の誤差についてぐぐれ。
0113デフォルトの名無しさん
垢版 |
2019/11/06(水) 03:29:15.89ID:normnvJW
>>111
おせっかいかもだがもうひとつ。
その手の誤差を回避するのは、ロジックでなんとかできることもあるが、実際にはなかなか難しいはず。
たまたま誤差が見えなくなってるだけの可能性もありそうなので、動作確認は慎重にな。

ちゃんとやるなら、decimal的なモジュールを使ったほうが。
あるかどうかは知らんけど。
0114デフォルトの名無しさん
垢版 |
2019/11/06(水) 03:46:51.16ID:QwLiS9cf
>>111
バクではなく仕様。
ちなみにPython,Tclで確認してみましたが同じ出力結果になりました。

どんな言語でも金額の計算や小数点の桁を調整をする場合、
int(切り捨て)、round(四捨五入)、ceil(切り上げ)などで処理するか、
出力時に、printfやsprintfを使って、"%.0f"などを指定して桁を合わせる
必要があると思います。
0115デフォルトの名無しさん
垢版 |
2019/11/06(水) 03:51:32.22ID:ZoqI13Ph
あるよ
use bigrat;
my %ISO_number = (
100 => 0,
125 => 1/3,
160 => 2/3,
200 => 1,
250 => 4/3,
320 => 5/3,
400 => 2,
500 => 7/3,
640 => 8/3,
800 => 3,
1000 => 10/3,
1250 => 11/3,
1600 => 4,
2000 => 13/3,
2500 => 14/3,
3200 => 5,
4000 => 16/3,
5000 => 17/3,
6400 => 6,
8000 => 19/3,
10000 => 20/3,
12800 => 7,
);

# dirty hack: 0/1 force rational type
# warning: if it locate last, sum goes WRONG!
printf "%s\n", 0/1 + $shutter_speed{$ss} + $F_number{$F} - $ISO_number{$ISO};
0116デフォルトの名無しさん
垢版 |
2019/11/06(水) 09:06:26.53ID:dfSHCt1W
浮動小数点の問題は知っていたが、こうなる事は初めて知った。危ないもんだな。

$c = $a / $b; # $c = 500
$e = int($c); # $e = 499
0117デフォルトの名無しさん
垢版 |
2019/11/06(水) 09:28:51.28ID:i85ttsqs
>>111
それはバグではないし、昔々からある超有名な仕様。知らないのはお前だけ。
0118デフォルトの名無しさん
垢版 |
2019/11/06(水) 10:08:35.95ID:yvB3xxPc
>>112
>>113
>>114
>>117
仕様で他の言語でもあるのですね。Perlで明示的な型指定とかはほぼ考えたことが無かった(1.08の時は意図した結果が得られていた)ので、勉強してみます。
ありがとうございます。
0119デフォルトの名無しさん
垢版 |
2019/11/06(水) 10:29:25.24ID:i85ttsqs
言語というよりはライブラリやCPUの問題だ。
しかしだいたいのメジャーな言語が採用しちゃってるので言語に関係なく出ると思って良い。
0120デフォルトの名無しさん
垢版 |
2019/11/06(水) 17:59:53.94ID:j94j+HrP
言語仕様っていうと違和感あるね
意図してこうしてますって感じで
IEEE 754の仕様といえばそうなのかもしれんがあれは規格であって
仕様とはまたニュアンスが違う なんつーか実数扱うときはそんなもんという感覚
0121デフォルトの名無しさん
垢版 |
2019/11/06(水) 18:58:09.30ID:yvB3xxPc
>>111
一応、取った対応策です(消費税計算なので精度は不要)
除算解は有効桁数以下が切り捨てになり表示などで見える値以下になると想定しました

$a = 550;
$b = 1.1;

$c = ;
$tax= int($a - $a / $b); # $tax = 50
$net = $a - $tax; # $net = 500


端数を残したまま税込から除算解を引いてintして税とし、税込から税を引いて本体としました
とりあえず期待した結果は得られています

ありがとうございました。
0122デフォルトの名無しさん
垢版 |
2019/11/06(水) 18:59:08.05ID:yvB3xxPc
$c = ;

この行余計でした
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況