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/
0514デフォルトの名無しさん
垢版 |
2020/07/24(金) 11:40:12.29ID:61Z/1/Bp
数が多いとツール作った方が早い
手動でやってもツール作っても時間同じなら、ツール作った方がいい
仕事では、ツール作ったせいで余計に時間かかってもツール作る
0517デフォルトの名無しさん
垢版 |
2020/07/24(金) 15:39:03.44ID:EkE5sKTE
perl -e "binmode STDIN; binmode STDOUT; while (read STDIN, $_, 0x8000) { substr $_, 0x1c, 1, 0; print }" < IN > OUT
これが最短?
0518デフォルトの名無しさん
垢版 |
2020/07/24(金) 15:58:32.23ID:JRbdBOQM
>>517
レスありがとうございます
泣きそうです(解らなすぎて)

>>509のスクリプトはバイナリ修正したコピーファイルを作成するものでした
小さなファイルなので問題ないのですが、目的の対象ファイルは10GB~20GBもあるものなのでマネ出来ません
0520デフォルトの名無しさん
垢版 |
2020/07/24(金) 16:07:20.05ID:UzZpGBU/
>>515
なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、
巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。
巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。
0521デフォルトの名無しさん
垢版 |
2020/07/24(金) 16:48:28.89ID:EkE5sKTE
直接書き換えたいならこんなとか?
perl -e 'open F, "+< IN"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0";
seek F, -$l, 1; print F }'
0523デフォルトの名無しさん
垢版 |
2020/07/24(金) 17:06:42.97ID:JRbdBOQM
>>521
ありがとうございます
Fはファイル名でよろしいでしょうか?(素人でごめんなさい)

Can't find string terminator "'" anywhere before EOF at -e line 1.
となります
0528デフォルトの名無しさん
垢版 |
2020/07/24(金) 20:38:39.07ID:So4dssPK
Stream 処理なら、バッファサイズ分のデータを、読んでは捨ててを繰り返すから、
必要なメモリサイズは、バッファサイズ分だけ

それか、seek みたいに、その番地をシークして、そこだけ書き換える
0529511
垢版 |
2020/07/24(金) 21:01:04.13ID:So4dssPK
0x8000 は、32,768 バイトだから、32 KiB。
(ただし、Kib は、1,000 倍ではなく、1,024 倍)

32 KiB * 32 個 = 1 MiB

1 GiB なら、 32個 * 1,024 = 32,768個
10GiB なら、0x8000サイズのブロックが、327,680個もあるの?

データ部分は固定サイズなの?
変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの?
0530デフォルトの名無しさん
垢版 |
2020/07/24(金) 21:50:07.62ID:EkE5sKTE
まーだやってたのか
>>523

perl -e 'open F, "+< ファイル名"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }'

がエラーになったのは Windows のコマンドプロンプトで試したんだろ
コマンドプロンプトでは ' でなく " を使ってこう

perl -e "open F, '+< ファイル名'; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, qq/\0/; seek F, -$l, 1; print F }"

もちろん read や print は流れで残してただけでまったく必要ないから

perl -e "open F, q/+< ファイル名/; binmode F; seek F, 0x1c, 0; while (! eof F) { seek F, 0, 1; print F qq/\0/; seek F, 0x7fff, 1 }"

で十分なのは言うまでもない
コマンドラインで書き捨てじゃないならperl7で不可予定の F じゃなくて $fh にするかな
0531511
垢版 |
2020/07/24(金) 22:51:07.42ID:So4dssPK
くれぐれも、データのバックアップを取っておいてから、実験しろよ。
もし、プログラムが間違っていたら、回復できないから

そもそも、他人のプログラムの意味が分からないのに、
それをそのまま実行するのは、非常に危険!
0532532
垢版 |
2020/07/24(金) 23:35:26.56ID:Z8MDOpZc
Binary fileをupdateモードでopenして
目的の位置にseekしpackで元のファイルの内容を直接書き換える方法なら

ttps://docstore.mik.ua/orelly/perl/cookbook/ch08_14.htm
0533532
垢版 |
2020/07/24(金) 23:36:19.14ID:Z8MDOpZc
>>530 と内容が被った…orz
0536デフォルトの名無しさん
垢版 |
2020/07/24(金) 23:46:10.28ID:JRbdBOQM
>>530
検証に時間がかかってしまって返信遅くなりました
できました!! ありがとうございました!

推察の通りコマンドプロンプトでのエラーでした
本命のLinux(Ubuntu)の端末上からも書き換え成功しました
感謝です

ほかの皆様もありがとうございました
不愉快に感じた方も多かったと思います ごめんなさい

ここで「進捗状況表示(%)をさせるにはどうしたらいいですか?」とか聞くと嫌われることは、僕もいい大人なので知っています
0537デフォルトの名無しさん
垢版 |
2020/07/24(金) 23:48:59.17ID:JRbdBOQM
>>532
親切にありがとうございます
0538デフォルトの名無しさん
垢版 |
2020/07/25(土) 00:54:10.29ID:uhXYZAuD
進捗状況を表示させるには、最初にファイルサイズを取得する。
そして、データを書き換えるたびに、現在のseek 番地を取得して、

現在のseek 番地 × 100 / ファイルサイズ

例えば、300 × 100 / 1,000 = 30 %
0539デフォルトの名無しさん
垢版 |
2020/07/25(土) 01:23:46.28ID:c7rlqrmm
>>538
レスありがとうございます
本当にうれしいのですがド素人なので理解出来ないのです

>>530のコマンドラインに絡めるかスクリプトにしていただけると卒倒するほど喜びます
これを機会にperlを勉強したいと(心から)思いますが、今の段階ではこんな図々しいお願いをするしか出来ません
0543デフォルトの名無しさん
垢版 |
2020/07/26(日) 08:04:49.79ID:faz+YmuJ
進捗表示は、計算自体は簡単だけど、ちゃんと見えるように表示するのが
ちょっと面倒なんだよな
0545デフォルトの名無しさん
垢版 |
2020/07/26(日) 11:13:19.32ID:faz+YmuJ
そんなもんがいちいちあるのか
まあ、凝ったことをするなら共通化はするだろうけど
凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、
UI特有の機能と関係ない面倒臭さの部分なんだよな
0546デフォルトの名無しさん
垢版 |
2020/07/26(日) 13:26:52.37ID:y3z4IjvW
ターミナルの機能を使いきるなら面倒だろうけど、ただ垂れ流すだけなら簡単やろ。
0547デフォルトの名無しさん
垢版 |
2020/07/26(日) 18:32:06.33ID:hRZi6+cn
>>512
最適化するとすると手順はこんな感じかな。

1. 0x1c バイト読んでそのまま書く。
2. 1バイト読む。読めなかったら 5 へ。読んだ内容が 0x40 なら 0x00 に変えて書く。0x40 でなければそのまま書く。
3. 最大 0x7fff バイト読み、読めたデータをそのまま書く。
4. 2へ。
5. 終わり。

STDIN から読んで STDOUT で書くならこうなる。

read(STDIN, $buf, 0x1c);
print $buf;
while (read(STDIN, $buf, 1)) {
 print $buf eq "\x40" ? "\x00" : $buf;
 read(STDIN, $buf, 0x7fff);
 print $buf;
}
0548デフォルトの名無しさん
垢版 |
2020/07/27(月) 00:36:57.42ID:Y15FmTu1
>>530さんからの頂き物に、ファイルサイズを取得。。。まではできました(訳:パクれました
みなさんありがとう
し、進捗。。。
----------------------------------------------------------------
open F, "+< ファイル名";
binmode F;
my $filename = "ファイル名";
my $filesize = -s $filename;
print "$filenameのサイズは$filesizeです。\n";
while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }
0549デフォルトの名無しさん
垢版 |
2020/07/27(月) 01:28:37.03ID:KvYX/iYh
>>548
いい加減にしろ
0550デフォルトの名無しさん
垢版 |
2020/07/27(月) 07:32:32.55ID:X6EMHfht
readして変更しないところまでprintするのは無駄なのに
無駄を省けば進捗表示がいらないくらい高速化するだろうに
0551デフォルトの名無しさん
垢版 |
2020/07/27(月) 09:23:37.46ID:HYhflFVx
コピーを作っておいて、そのコピーの一部だけ変更して書き戻せば一瞬
信頼性が上がったら、コピーは作らずにオリジナルを変更する
0554デフォルトの名無しさん
垢版 |
2020/07/27(月) 18:21:31.29ID:Y15FmTu1
呼ばれた気がしたので
約10分のデータ(1.3GB)で比較しました

readあり

real 1m34.485s
user 0m0.888s
sys 0m6.100s

readなし

real 1m5.851s
user 0m0.340s
sys 0m3.563s

USB2.0()でUbuntuにマウントさせた外付けHDD上のデータを直接書き換えています
特殊なフォーマットなのでWindowsでは認識できないのです
0555デフォルトの名無しさん
垢版 |
2020/07/27(月) 19:14:13.61ID:KvYX/iYh
DRM解除の片棒担ぐ人達かね
0557デフォルトの名無しさん
垢版 |
2020/07/27(月) 19:46:48.42ID:Y15FmTu1
残念ながら暗号化解除まではされないんです
別の機器にコピーしようとしても「コピープロテクトがなんちゃら。。」と、ちゃんとハネられます
機器内の制限を緩くするためのオフホワイトな作業です
0558デフォルトの名無しさん
垢版 |
2020/07/27(月) 20:24:22.40ID:2I3xUck9
頭悪くてプログラムしかできなかった大企業CEO一覧
http://re-file.com/18k/1677/
0563デフォルトの名無しさん
垢版 |
2020/07/28(火) 00:29:51.31ID:cSYuj1Eq
>>557
お前は裁判になって負けたら責任全部背負うのか?
0564デフォルトの名無しさん
垢版 |
2020/07/28(火) 01:16:10.36ID:YHRj/bUX
責任w
0567デフォルトの名無しさん
垢版 |
2020/07/28(火) 01:48:48.45ID:R7vB/BT5
コピー許可するフラグをいじるのは私的利用の範囲なら自由じゃないですか?
ここでその方法を聞いたりその答えを書いたりした人がどうなるかはわかりませんが
0568デフォルトの名無しさん
垢版 |
2020/07/28(火) 02:17:19.93ID:F+mRlQPD
>>567
他人が使うためにプログラムを公開することに問題がないとでも?
0569デフォルトの名無しさん
垢版 |
2020/07/28(火) 02:23:12.72ID:p8KDyqHY
Winnyの作者は捕まるが利用者は捕まらない
包丁の販売は捕まらないか利用者は捕まる事が有る
YouTubeであるけど包丁を自作して販売したら捕まるのか?
0570デフォルトの名無しさん
垢版 |
2020/07/28(火) 02:35:26.47ID:R7vB/BT5
>>568
コピー許可フラグを取り除くプログラムを公開することは問題ありと見ているわけですね
確かに東芝の全機種に対して動作可能であるなら影響は大きそうです
0571デフォルトの名無しさん
垢版 |
2020/07/28(火) 05:40:11.08ID:U3aN9PuQ
おかしな雲行きになってきたので説明(釈明)を

まず第一に、このスクリプトだけでは目的を達成することができません
いくつか別ファイルを修正する必要があります
当然ながらこのスレではそれらは公開されていません
不完全な変なデータが出来上がるだけです

第二にこの手法が通用するのは、10年以上前に発売された「ある機種」のみです
次機種以降ではこの"バグ"はすっかり塞がれました
ディスクの中身をこれほどたやすく弄れるなんて話は聞いたことがないです
今現在どれほどの人がこの機種を使っているか知りませんが。。。

そしてこれは「暗号化解除」を目的としていません
ヘッダの一部分をちょっと弄っただけでプロテクトが外れるとか、幼稚園児ですか?
これはデータを細工して機器を「騙している」にすぎません
0572デフォルトの名無しさん
垢版 |
2020/07/28(火) 05:41:52.28ID:U3aN9PuQ
「暗号化解除ではない」と書いているのに裁判(w)とか責任(w)とか言ってる人って
字が読めないのか、頭が悪くて理解できないのか、あるいは目が見えないのか
10年前も当時の2ちゃんねる()で話題になって多くのスクリプトやプログラムも配布されました
彼らは訴えられたのかなぁ?心配です(棒

ついでに言えば
実は>>530は私です
壮大な自作自演です(今時)
進捗表示を教えてほしかっただけなのです。。。

みなさん釣り堀へようこそ

そして農家の朝は早い
0573デフォルトの名無しさん
垢版 |
2020/07/28(火) 05:43:41.18ID:U3aN9PuQ
それでは最後に

普段から社会にこれっぽっちも貢献してないくせに、こんな匿名掲示板で妙な倫理観や底が浅い正義感を振りかざすとか

以降、間抜けな人たちの「負け惜しみ」のレスが続きます
屁理屈、論点ずらし、人格否定など、つたない書き込みをしばらくの間お楽しみください
合わせて「おかしな雲行き まで読んだ」もお楽しみください
0574デフォルトの名無しさん
垢版 |
2020/07/28(火) 06:49:13.06ID:Z44sycP1
釣り堀する前に、Linuxインストールできるようになれよ。
0575デフォルトの名無しさん
垢版 |
2020/07/28(火) 07:03:33.82ID:U3aN9PuQ
Linuxで思い出したが、最新のUbuntuとかでは(仕様変更で)その機種の外付けHDDを「書き込み可」
でマウントできない
手動で”-RW”オプション付けてマウントしようとしてもダメ
書き込みできないからスクリプトもエラーになる
仕方ないのでUDF関連のソースファイルを弄ってカーネルをコンパイルしている
多分世界で私だけだと思う(そんな需要があるわけない)

>>574
頑張って
0576デフォルトの名無しさん
垢版 |
2020/07/28(火) 07:08:12.80ID:Z44sycP1
パソコンはコマンドが基本だからな。
コマンド出来るようになれよ。
0577デフォルトの名無しさん
垢版 |
2020/07/28(火) 07:37:42.56ID:s7pIWQUC
readの有無で差がなさすぎて信じがたいんで実験してみた

RAMディスクで fsutil file createnew data 2000000000 して

Measure-Command { perl -e 'open F, q/+< data/; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, qq/\0/; seek F, -$l, 1; print F }' } | % TotalSeconds
2.8214867

Measure-Command { perl -e 'open F, q/+< data/; binmode F; seek F, 0x1c, 0; while (! eof F) { seek F, 0, 1; print F qq/\0/; seek F, 0x7fff, 1 }' } | % TotalSeconds
1.3621179

readしなくても32KB毎に書く時に読むだろうからこんなもんか
0578デフォルトの名無しさん
垢版 |
2020/07/28(火) 13:31:46.55ID:DVrEteyf
>>571
あんた誰?
0580デフォルトの名無しさん
垢版 |
2020/07/28(火) 15:14:32.97ID:DVrEteyf
ひみちゅ
0581デフォルトの名無しさん
垢版 |
2020/07/28(火) 16:12:16.22ID:7IzxJUwl
>>580
なんかこの人好きやわ笑笑
0582デフォルトの名無しさん
垢版 |
2020/07/28(火) 20:58:23.32ID:U3aN9PuQ
約13GBのデータで(usb2.0)

2ch配布Linuxネイティブアプリ@10年前 64bit版
 12m10.357s
Perlスクリプト readあり
 12m5.101s
Perlスクリプト readなし
 8m38.678s
0583デフォルトの名無しさん
垢版 |
2020/07/28(火) 21:18:54.63ID:LCUSVvjE
>>582
死ね、クズ
0584デフォルトの名無しさん
垢版 |
2020/07/28(火) 21:42:15.96ID:7IzxJUwl
>>583
ネットでの暴言はインキャがすること。
てめぇはこうなれ!!!
http://re-file.com/18k/1669/ (結構グロ)
0585デフォルトの名無しさん
垢版 |
2020/07/28(火) 21:51:29.80ID:rf/YfV6w
殺したいほど嫌悪するような事か?
おそらく心の病気だから早く病院行った方がいい
0586デフォルトの名無しさん
垢版 |
2020/07/28(火) 22:01:24.31ID:7IzxJUwl
>>585
あの〜傍観者なのですが、これって584と583
どっちに言ってるんですか??
0588デフォルトの名無しさん
垢版 |
2020/07/28(火) 22:27:18.25ID:7IzxJUwl
ネットはこうでなくちゃ!明日の学校めんどいけど、この争いみたら
楽になれる!
0591デフォルトの名無しさん
垢版 |
2020/07/28(火) 23:54:00.05ID:7IzxJUwl
>>590
福岡県福岡市東区在住
西南学院中学二年〇組テニス部
学力推移調査:225/223位
全教研赤坂本校筑女,西南合同vクラス
明日の時間割英会話.社会.聖書.体育
(保護者面談なので4限授業)
頭は悪いがプログラムができるのでマークザッカーバーグ
のように校内snsをつくって流行らせようとしてます笑笑。
昨日、無断で水曜日に部活休んだのでめちゃくちゃ怒鳴られました。
明日の聖書は、「手紙」というくだらない日本映画を見ます。
今日は一時から「爆笑問題カウボーイ」というラジオがあるので、
monsterのんでずっと起きてます。2年になって運が悪いことに親しかった
友達は2組と五組に分かれてしまい、僕だけ〇組という
辺境の地に飛ばされました笑笑。好きなアーティストは「ずっと真夜中でいいのに」
という顔出ししていないバンドです。さっき5chのずとまよ専用スレで顔写真をみて、
とても美人だったので今すごくうれしいです。好きなサイトは、「リファイル」というグロサイトです。
「西南学院中学2年という名前でコメント投稿してるので、グッドボタン押して下さい。
0592デフォルトの名無しさん
垢版 |
2020/07/28(火) 23:55:04.17ID:V3SVLGoH
>>590
学校の先生かも知れんよ
0593デフォルトの名無しさん
垢版 |
2020/07/28(火) 23:59:10.33ID:7IzxJUwl
ほんとに信じてくれ!
0594デフォルトの名無しさん
垢版 |
2020/07/29(水) 00:00:07.74ID:hFsck1GX
>>592
全然信じてくれんやん笑笑
0595デフォルトの名無しさん
垢版 |
2020/07/29(水) 00:01:21.85ID:hFsck1GX
>>591
というか、こんなにネットにさらすのはやばかったかな?
0596デフォルトの名無しさん
垢版 |
2020/07/29(水) 00:05:34.09ID:hFsck1GX
>>590
逆に聞きますが、あなた五十過ぎのオッサン
何ですか?( ´∀` )
0597デフォルトの名無しさん
垢版 |
2020/07/29(水) 00:11:56.16ID:g1h81RwA
>>593
リアル厨房なら、perlなんかやめたほうがいいね。
python のほうがずっと言語仕様が綺麗で、複雑な処理も簡単にこなせる。
今、perlを使っているのはな、20年前からperlを使ってて、
他の言語に乗り換える気力も失ったオッサンばっかりだよ。
0598デフォルトの名無しさん
垢版 |
2020/07/29(水) 00:13:37.08ID:CwVjY0Ri
蛇より真珠のがキレイだ
0599532
垢版 |
2020/07/29(水) 00:13:51.84ID:gNILtmsT
python, goなど他の言語もやってますが
0600デフォルトの名無しさん
垢版 |
2020/07/29(水) 00:19:14.22ID:hFsck1GX
>>597
最近はperlよりphpに力を入れてます
0602デフォルトの名無しさん
垢版 |
2020/07/29(水) 02:59:07.17ID:TsNd4noZ
Kotlinもよろしく
0603デフォルトの名無しさん
垢版 |
2020/07/29(水) 07:08:18.48ID:q44g7qzE
問題
----
$flags に格納されているフラグ 0x40 をリセットして 0x00 にする
次の3通りの処理から採用する方法を理由を添えて答えなさい

   a. $flags = 0x00
   b. $flags = 0x00 if $flags == 0x40
   c. $flags &= ~0x40
0604デフォルトの名無しさん
垢版 |
2020/07/29(水) 08:33:33.53ID:W2ZwK0DF
でも、そこだけ書き換えて、ちゃんと動いたの?

もし、チェックサムがあれば、エラーになるはずだけど
0605デフォルトの名無しさん
垢版 |
2020/07/29(水) 15:15:31.23ID:opF1rrDZ
>>597
個人的にはサーバプログラムはgo
時点でpythonかな
perlはlinuxなら環境を選ばないという点で、シェルスクリプトはperl一択
それぞれに良さがある
0606デフォルトの名無しさん
垢版 |
2020/07/31(金) 06:23:48.86ID:uvjudIRN
>>603
a, b は他のビットが0になっても良い場合、及びbは他のビットが0の場合に動く。
cは
あ、ちょっと今書いてる時間ない。誰か他の人よろしく。
0607デフォルトの名無しさん
垢版 |
2020/08/02(日) 05:05:52.61ID:IlYSPDQE
Cは他のビットを崩さずに 0x40 の所のビット(2進だと01000000)だけ0にする。
0608デフォルトの名無しさん
垢版 |
2020/08/02(日) 07:04:07.45ID:MjfLntA9
何を 0x00 にするのか不明確な時点で出題者の頭が悪い。
a を意図しているなら 0x40 は関係ないし
b を意図しているなら「0x40 をリセットして」ではなく「0x40 がセットされていれば」と
書かれていなければならない。
ひょっとして、元の値が 0 だったらリセットしたことにはならないということか?
c を意図しているなら他のビットが全部 0 の場合に限り「$flags の値を 0x00 にする」
ことになるだろうが、そのようには書かれていない。
$flags & 0x40 を 0 にするということなら、 0x00 と表記するのは
値としては同じでも適切な表記なのか疑問が残る。
しかしこれが最も無理のない解釈だろう。
こんなに忖度させるようでは出題者は落第だ。
0613デフォルトの名無しさん
垢版 |
2020/08/02(日) 12:40:43.04ID:L8TYFRoG
水掛け論でしょ 言語仕様を理解しないで適当に書いてちゃんと動くかどうかの話
■ このスレッドは過去ログ倉庫に格納されています