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

■ このスレッドは過去ログ倉庫に格納されています
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/
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};
2019/11/06(水) 09:06:26.53ID:dfSHCt1W
浮動小数点の問題は知っていたが、こうなる事は初めて知った。危ないもんだな。

$c = $a / $b; # $c = 500
$e = int($c); # $e = 499
117デフォルトの名無しさん
垢版 |
2019/11/06(水) 09:28:51.28ID:i85ttsqs
>>111
それはバグではないし、昔々からある超有名な仕様。知らないのはお前だけ。
118デフォルトの名無しさん
垢版 |
2019/11/06(水) 10:08:35.95ID:yvB3xxPc
>>112
>>113
>>114
>>117
仕様で他の言語でもあるのですね。Perlで明示的な型指定とかはほぼ考えたことが無かった(1.08の時は意図した結果が得られていた)ので、勉強してみます。
ありがとうございます。
119デフォルトの名無しさん
垢版 |
2019/11/06(水) 10:29:25.24ID:i85ttsqs
言語というよりはライブラリやCPUの問題だ。
しかしだいたいのメジャーな言語が採用しちゃってるので言語に関係なく出ると思って良い。
2019/11/06(水) 17:59:53.94ID:j94j+HrP
言語仕様っていうと違和感あるね
意図してこうしてますって感じで
IEEE 754の仕様といえばそうなのかもしれんがあれは規格であって
仕様とはまたニュアンスが違う なんつーか実数扱うときはそんなもんという感覚
121デフォルトの名無しさん
垢版 |
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して税とし、税込から税を引いて本体としました
とりあえず期待した結果は得られています

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

この行余計でした
2019/11/06(水) 19:44:41.92ID:mEOqpT9o
>>120
C/C++なら規格が精密なのでそういう違和感もわかるが、Perlの場合は逆におかしいやろ。w
2019/11/06(水) 19:52:26.69ID:mEOqpT9o
>>121
税率によってはきっとアカン場合がありそう。。。
単純な切り捨てはヤバいような。
まあ、そこまでの精度はイランのやろけども。

ちなみに、今回のケースなら、$x/1.1とするのではなく、$x*100/110としたほうが安定しそう?
125デフォルトの名無しさん
垢版 |
2019/11/06(水) 20:39:05.70ID:yvB3xxPc
>>124
うちは税込ものを分離する時は消費税側で小数点以下切り捨てなのでOKなのです
四捨五入とか会計方針によっては稀に問題が出るかもしれませんね
126デフォルトの名無しさん
垢版 |
2019/11/06(水) 21:15:49.18ID:i85ttsqs
1.1を掛けるなら11を掛けてから10で割った方が良いかもな。そうすると正数計算でやれる。
切り上げや四捨五入をしたい場合は10で割る前に一桁目を見て10を足したり足さなかったりすれば良い。
127デフォルトの名無しさん
垢版 |
2019/11/06(水) 21:18:49.26ID:i85ttsqs
ああ。逆か。税込みから本体と税を求めるのか。でも考え方は同じだな。
2019/11/07(木) 00:06:59.16ID:gr4VkOsJ
>>125
違うぞ。今回の問題点をちゃんとわかってるか?
1.1と書いたリテラルが、実際の値は1.10...となっていて、1.1よりも大きかったことだぞ。

誤差の具合によっては、正確には切り捨てが不要な値でも、除数が大きいせいで計算結果が実際よりも小さい値になってしまって、してはいけない切り捨てが発生してしまう可能性はないんかね。
2019/11/07(木) 00:07:26.65ID:gr4VkOsJ
>>126
>>124
130デフォルトの名無しさん
垢版 |
2019/11/07(木) 01:08:34.48ID:q6f07NqD
>>128
消費税は小数点を使わず整数計算で
10 /110
8 / 108
で計算するようにします

アドバイスありがとうございます
131デフォルトの名無しさん
垢版 |
2019/11/07(木) 01:12:13.17ID:q6f07NqD
>>128
うちの会社ではあんなに国家予算並みにたくさん「0」が出てくる消費税計算は無いのでとりあえずの回避でも大丈夫です
とはいえ先ほどのように整数計算に修正しようと思います
2019/11/09(土) 10:00:40.69ID:q+fGPpet
どちらにせよ、小数点以下をどう扱うかは仕様で決めないとダメだな。
2019/11/14(木) 22:54:58.33ID:cMIrVE8k
ファイルハンドル($fh)からファイル名を取得する方法ってありますか?
・stat $fhでinode取得してシェルのfindで見つけるってのはコストかかるのでやりたくない。
*{$fh}{IO}辿ってIO::Fileから得られないかなって調べたんですけど分かりませんでした。
基本的にそういう思想がないってことかも知れません。
2019/11/15(金) 00:28:22.57ID:WAwhq9DE
ムリやろ。
ファイル名のないファイルハンドルも少なくないしな。
135デフォルトの名無しさん
垢版 |
2019/11/15(金) 12:49:10.35ID:qkK0C17l
ファイルハンドルからファイル名を求めるシステムコールとかもないしな。
ハードリンクされてて1つのi-nodeで複数のファイル名を持ってたらどうすんのっていう問題もある。

自分の作ったプログラムの中だけでいいならそのプログラム内だけの独自のopen,close作ってそこでファイル名を保持しとけば良いんじゃないかな。
2019/11/15(金) 22:37:17.80ID:9LSwivmi
お二方ありがとう
そもそもそういう使い方をするものではないって理解しました
2019/11/17(日) 00:22:07.56ID:+/PgA3gU
そもそもファイルをopenした時点で、ファイル名は自明だろ、、、
<>の場合は、今開いているファイル名は、$ARGVでアクセス出来るし、、、
while(<>){ print $ARGV if $. == 1 ; $. = 0 if eof }

他は、自分でコード書くんだからファイルリストの管理すりゃいいだけの
話だし。
138デフォルトの名無しさん
垢版 |
2019/11/17(日) 00:47:01.26ID:7P3Fm4Oa
>>137
ファイルハンドルだけもらうクラスかもよ
2019/11/17(日) 01:44:18.01ID:cO7DNsZu
いや、気持ちはわかるやろ。
ファイルハンドルは、しょせんハンドルでしかないと納得するのは、事情がある程度わかってからなんだから。
140デフォルトの名無しさん
垢版 |
2019/11/17(日) 07:47:40.51ID:bNRHw2eJ
ファイルハンドルをインクリメントすると次のファイルを指すハンドルになることはあまり知られていない。
2019/11/17(日) 12:07:49.00ID:Ew4nGi4g
>>140
それは、Perlのファイルハンドルの話か?
Cのファイルポインタではなく?
2019/11/18(月) 08:50:22.41ID:4tmHvePg
ActivePerl 5.22 から 5.28 にアップデートしたのだが、
次のものがなくなってしまって、とても不便になった気がする。
・PerlEz.dll
・ppm(perlパッケージマネージャー)
・htmlドキュメント

他の2点はいいとしても、PerlEz.dllが無いと生きていけないので、
5.22 に戻した。もう一生5.22 を使い続けることになるのかな。
なぜ、こんな事をするのだろうか?
2019/11/18(月) 20:45:39.28ID:2uYwgX87
Strawberry Perl 使えよ
2019/11/22(金) 22:32:44.69ID:G0qxcoi/
そういやみんな最新の安定版使ってんの?
うちは5.20で止めてる。特に意味はないんだけどこれが安定してるってどこかで見たから。
2019/11/22(金) 23:56:39.64ID:0hNsLKVA
5.16.3だな
多分意味は無い
146デフォルトの名無しさん
垢版 |
2019/11/23(土) 00:04:49.15ID:pA1s2lMR
俺もCentOSのデフォルトだわ
5.16.x
もう枯れてるしね
2019/11/23(土) 00:20:10.52ID:FBMqwUlj
ずっと5.8.9のままだわ
とにかく安定している
2019/11/23(土) 01:08:20.02ID:uP8OeUg3
perlのワンライナーについて質問です。

cat /home/xxx/aaa.txt | perl -spe 's/AA/$var/; END{print "complated.\n"}' -- -var="BB" > bbb.txt

上記のようにすると、END部分の終了メッセージもbbb.txtに保存されてしまいます。
そこで下記のようにしてみたのですが、入力ファイルの指定と"--"以降の引数がうまく与えられずエラーになります。

perl -i -spe 's/AA/$var/; END{print "complated.\n"}' /home/xxx/aaa.txt -- -var="BB"

どのようにすれば入力ファイルの指定と変数渡しを一緒にできますか?
2019/11/23(土) 01:52:51.48ID:0LKgjFg3
5.30.0
なるべく最新の安定版を追っかけてる
2019/11/23(土) 02:19:04.46ID:En+bKilB
>>148
STDERRにprintすれば?
2019/11/23(土) 10:12:25.15ID:Dim3LBiC
perl5.26.1
perl2exe 使うので。
2019/11/24(日) 00:31:51.83ID:jceUCsgs
>>150

ご意見有難うございます。
ファイルを一番最後に入れるとできるということがわかりました。

perl -i -spe 's/AA/$var/; END{print "complated.\n"}' -- -var="BB" /home/xxx/aaa.txt
153デフォルトの名無しさん
垢版 |
2019/11/25(月) 10:33:31.52ID:veETdbiQ
>>152
-i があるからでは?

-i.bak とかやっとくと .bak をファイル名に付加したバックアップ作れるよ。
多分新規ファイル開いてそちらに出力して後でリネームして元ファイルのバックアップを取ろうとしてるんだろうと思う。
-i の直後に何もない場合はバックアップ取らずに元ファイルにリネームだけやってるんだと思う。
2019/11/26(火) 23:14:08.94ID:EA1DZQ5h
>>153

コメントありがとうございます。
今回やることはファイルに上書きしたくバックアップもいらなかったので -i で良いかなと思っていました。
ワンライナーはよくお世話になってるのですが、今回-sでperl内に変数として渡せることがわかり、ますます重宝しそうです。
2019/11/30(土) 17:02:59.68ID:hCKH6fU7
今日、学んだこと。

/^([a-c]){2}\1/
は 'abb' にはマッチできるが 'aba' にはマッチできない。
もちろん 'aaa' にはマッチできるが…要するに
/^([a-c]){2}\1/

/^([a-c])\1\1/
と同じではなかった。
2020/02/01(土) 09:03:36.56ID:qxbFBKGD
パターンの中で\1って使えるんや…
正規表現って普通「事前に」FSMにコンパイルされてからマッチングに使うるんじゃないの…?
バックトラックとかする高度な実装のやつはまた違うんかね
2020/02/01(土) 13:27:18.26ID:wtOh7v6m
>>156
¥1は、むしろパターンの中でしか使わない。外で使うときは$1のほう。
正規表現は、バックトラックがあたりまえ。しない実装なんかあるか?

いろいろ勘違いしてるぞ。
2020/02/02(日) 08:34:53.41ID:7b/FZYuN
>>157
話が通じなさそうで大変よろしい
2020/02/02(日) 13:46:05.69ID:9cWLJdKQ
s/(pattern)/\1/
という使い方をするもんだと思いこんでいて、謎のバグに悩んだ
2020/02/04(火) 19:17:18.71ID:64ds8brY
perl hacks買った
送料込み300円
2020/02/04(火) 19:49:23.22ID:53yGrLtS
買われてしまった。
モダンperl入門でも買おうかな
2020/02/05(水) 00:34:08.21ID:Yyzz6n+F
今さら「モダン」もないやろ。w
どうとでも好きに書いたらええがな。
2020/02/05(水) 04:02:23.57ID:rxl56Lqp
モダンとか死語だもんな
そういうワード使うしかなかった当時の状況もあるけど
164デフォルトの名無しさん
垢版 |
2020/02/05(水) 17:51:27.40ID:9nK7Yle0
死語かなあ?
2020/02/05(水) 21:33:12.52ID:SZWAnwkp
>>156
決定性有限オートマトンと非決定性有限オートマトンについて調べるといいぞ。
lex は前者で Perl は後者だ。
2020/02/05(水) 22:58:10.81ID:TkSDhbEE
そういやモダンperl入門の新刊どうなった?
2020/02/05(水) 23:00:15.23ID:TkSDhbEE
2014年1月予定か。たのしみやで。
2020/02/06(木) 00:10:26.01ID:UIZEnib+
perlの最新本って、これくらいだろ
初めてのPerl 第7版 2018/01/20
Effective Perl 第2版 2015/02/17
2020/02/06(木) 00:14:16.79ID:m/3X75FJ
クリスマスまでにはperl6の本が山のように出版されるからな
2020/02/06(木) 00:24:20.95ID:T14/xjtC
ドラマ「3000回目のクリスマス」
2020/02/06(木) 00:30:59.99ID:6QnB4wyK
Perl6無くなったんじゃなかったっけ?
2020/02/06(木) 14:10:21.68ID:EPBtHi1S
ちっちゃくRakuって書くんじゃない?
2020/02/10(月) 22:55:04.23ID:hYCIpnsp
非決定性有限オートマトンは決定性有限オートマトンに変換できる
ていうか両者の能力は同じ(正規言語止まり
2020/02/10(月) 23:09:15.59ID:O7nANUNm
ゲーデル?
2020/02/11(火) 08:07:12.06ID:RnNFx+rl
んまーできると言っても状態数の爆発を伴うこともあるので
非決定性有限オートマトンのままにしといて入力が来たときに探索(バックトラック)で解決、
というのもアリっていやーアリ
176デフォルトの名無しさん
垢版 |
2020/02/11(火) 17:49:46.25ID:ix+UlUL8
名前変えたんだよね?やっぱ違いがありすぎて紛らわしいから変えたのか?
177デフォルトの名無しさん
垢版 |
2020/02/11(火) 17:50:45.15ID:ix+UlUL8
すまん。リロード忘れて間に他の書き込みが挟まった。Perl6の話ね。
2020/02/11(火) 18:26:47.40ID:FJnR5oDj
ロゴもどうなんだ
2020/02/11(火) 22:24:33.99ID:kUx05S+X
>>176
少なくとも、もうPerlでは無いと言うことだ
Perlの系譜にある別言語だね
180デフォルトの名無しさん
垢版 |
2020/02/12(水) 01:53:33.21ID:CB9IiDBv
YouTuberは「最強の職業」である理由。
https://www.youtube.com/watch?v=XjV3Nb0-hgA
【事例付き】YouTuberは最強の副業である件について。
https://www.youtube.com/watch?v=wB8hNuNVoIw&;t=267s
【初心者向け】YouTubeの始め方・稼ぎ方を徹底解説!
https://www.youtube.com/watch?v=YEw-a8qlADM
「YouTubeなんていつか稼げなくなる」という主張を論破する。
https://www.youtube.com/watch?v=VatNILApW4U
収益化から丸1年!YouTubeでいくら稼いだか公開。
https://www.youtube.com/watch?v=-zQxuQqZ5eA&;t=103s
その動画で月商○○万!? YouTubeで稼ぐ裏技的アプローチ。
https://www.youtube.com/watch?v=7I4APU_6i9o&;t=433s
【貧者の工夫で戦え】ガラケーだっていい。YouTube始めるのにパソコンはいらない!
https://www.youtube.com/watch?v=jYdWfjjzD7Y
【第一回】SNS、YouTube、ブログで稼ぐ方法を、丁寧に解説します!
https://www.youtube.com/watch?v=erNiLOncDnY
2020/02/12(水) 07:13:33.96ID:ZjDcS8oe
元から別言語定期
2020/02/12(水) 10:59:57.05ID:urwrbVLd
Python もそのくらいやって欲しい。
2020/02/12(水) 16:01:22.42ID:SF/q3PcI
Rakuは設計当初からオプショナルな型システムあるし
numpyっぽい操作が言語組み込みだったり
いろいろ早すぎた
2020/02/13(木) 01:14:31.03ID:on7ESczL
当初はすごいと思ったけど今見ると糞仕様だな
185デフォルトの名無しさん
垢版 |
2020/02/15(土) 12:59:07.78ID:8m1Cr/X/
ハッシュの配列とかも簡単にできるもんね。
perlで作ったプログラムをC++で作り直すと思うとゾッとするw
2020/02/15(土) 14:49:16.24ID:av6eWd5V
ハッシュの配列とかスクリプト言語の類ならどれも同じようにできる。
Perlがだめなのは、スカラとリストの二つが存在することだな
同じ書き方をしても、使い方で意味が変わってしまう。
変わるだけならともかく違う解釈で動いてしまうからバグのもとに鳴る。
2020/02/15(土) 16:00:24.43ID:CBuE7ub7
>>186
リストは使わずに全部リファレンスでやった方がいろいろ安全だよ
2020/02/15(土) 16:25:27.75ID:33mO6l2/
なるほどそうかもしらん
2020/02/15(土) 18:59:30.30ID:jU+J++ht
$aと@aが区別されるので調子に乗って、
$a->[0][0][0] と一緒に $a も使ってバグる
190デフォルトの名無しさん
垢版 |
2020/02/16(日) 20:31:14.76ID:7RTwZ9VV
まあ、自分で作るには兆便利だけど人のプログラムの修正やメンテはやりたくないなw
やっぱ、C言語ぐらい厳しくないとプロ用は無理だよね。
2020/02/17(月) 00:50:46.53ID:qx2LCmQN
Cは厳しさが足りない!
2020/02/17(月) 09:02:59.28ID:3xf/X3D3
他人が書いたものばかりでなく、1年前ぐらいに自分が書いたものを
修正しようとして、「なにやってんの?これ」と思う。
自分自身のために、「しつこいぐらいにコメントを入れる」を心がけてるよ。
2020/02/17(月) 10:26:17.75ID:DZOr9dsV
それ以前にコメントがなくてもわかるようなコードにしてるよ
2020/02/17(月) 13:13:07.93ID:ZZZ2hHJ7
マクロなコードは読んで意味がわかるものにするのは当然として
コメントはビジネスロジックと言うか、フローの説明じゃね
2020/02/17(月) 13:17:02.86ID:5usMQUGr
書いてあることを説明する必要はない。
コメントで書くのは、なぜこんなフローにしたかだ
2020/02/17(月) 13:21:56.88ID:ZZZ2hHJ7
ミクロだわ恥ずかしい(´・ω・`)
2020/02/17(月) 15:20:38.00ID:wTmXuXv8
一見すると何やってんだか分からなくてもよく辿るとスゲエなこれ天才じゃねって思うことある
自分が書いたんだけどね
2020/02/17(月) 20:40:48.55ID:Y4S6wB9m
書くのも読むのも全然困らないようなコードしか書かないのが理想

難解な処理は、きっともっとシンプルに解決できる
2020/02/17(月) 22:34:20.51ID:qx2LCmQN
現実はそうではない。
200デフォルトの名無しさん
垢版 |
2020/02/18(火) 20:13:13.66ID:55IHv/fO
my @result = grep !$temp{$_}++, @list;

凄げーよね、@listをuniqにソートするコードだって。
パールならではだよね。
普通なにしてるかわからんよw
2020/02/18(火) 20:25:02.62ID:2VKhUmei
それは慣用句なので割と判る
コメントくらい付けるけど
2020/02/18(火) 20:32:09.78ID:KQgsUf00
result = list(set(LIST))

pythonのほうが圧倒的に簡単
2020/02/18(火) 21:09:43.77ID:lAgti/Dg
>>200
これでなんでソートされるの?
2020/02/18(火) 21:10:15.76ID:Z1cJ/QMX
>>200
それじゃあソートできてないだろ

my @result = sort grep !$temp{$_}++, @list;
2020/02/18(火) 21:32:52.05ID:v/AIhdlf
>>202
sort 使わずに sort できるなんて凄いな。
206デフォルトの名無しさん
垢版 |
2020/02/18(火) 21:34:51.09ID:55IHv/fO
>>203
>>204
ゴメンソートは関係無かった。

uniqしたくて、検索したらこれが出てきたんだけど、自分で作るなら
for文で回してif文でチェックしてpushで配列に入れる。まあ、どんな言語でも動くやつね。

パッとこのコードが書けるんならいいけど、ここで時間を掛けたくないよね。
2020/02/18(火) 21:48:33.85ID:3v1Ek71E
普通のfor文で書けばよくね?w
2020/02/18(火) 21:53:35.14ID:2VKhUmei
機能がはっきりしてるから、sub uniqか何かを作って言語仕様かのように書く
きっと既にあるから、コピペで済む
2020/02/18(火) 22:00:21.17ID:3v1Ek71E
まあ余程の理由がない限り普通はList::Util使うね
2020/02/18(火) 22:14:59.19ID:2AC9Ct1n
ワンライナーカッケー病なんだろ
2020/02/18(火) 22:20:53.62ID:KQgsUf00
ハッシュを使ってカウントするなんてperlの定石なんだが
入門書のハッシュ解説で必ず載ってるぞ
2020/02/18(火) 23:17:41.56ID:aJeTcUgK
>>209
普通は>>204でしょ
モジュールは精査して本当に必要なものしか入れない
まあ現場次第だと思うが
213デフォルトの名無しさん
垢版 |
2020/02/19(水) 00:10:20.47ID:XDqysw2e
>>200
Rubyだとuniqが使えるが配列の集合演算でもできる。
result = list | []
2020/02/19(水) 00:43:04.19ID:6o0SSmsW
実装は面白くても実際の所普段の仕事では
わかりやすいインターフェースの関数にするから
そういう点で差はでないというね。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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