[過去ログ] Perlについての質問箱 64箱目 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
518: 2020/07/24(金)15:58 ID:JRbdBOQM(4/10) AAS
>>517
レスありがとうございます
泣きそうです(解らなすぎて)

>>509のスクリプトはバイナリ修正したコピーファイルを作成するものでした
小さなファイルなので問題ないのですが、目的の対象ファイルは10GB~20GBもあるものなのでマネ出来ません
519: 2020/07/24(金)16:06 ID:JRbdBOQM(5/10) AAS
>>509の全文です

画像リンク


後出しのクセが強すぎすいません
520: 2020/07/24(金)16:07 ID:UzZpGBU/(1) AAS
>>515
なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、
巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。
巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。
521
(1): 2020/07/24(金)16:48 ID:EkE5sKTE(2/3) AAS
直接書き換えたいならこんなとか?
perl -e 'open F, "+< IN"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0";
seek F, -$l, 1; print F }'
522: 2020/07/24(金)17:06 ID:61Z/1/Bp(2/2) AAS
別に短く書くコンテストではない
523
(1): 2020/07/24(金)17:06 ID:JRbdBOQM(6/10) AAS
>>521
ありがとうございます
Fはファイル名でよろしいでしょうか?(素人でごめんなさい)

Can't find string terminator "'" anywhere before EOF at -e line 1.
となります
524: 2020/07/24(金)17:29 ID:JRbdBOQM(7/10) AAS
サンプルです
外部リンク[SRO]:www.dropbox.com

もしよろしければ暇つぶしに、ご指南いただけませんか?
(もう、いただいてますけど)
525: 2020/07/24(金)17:49 ID:JRbdBOQM(8/10) AAS
よく考えたらダメだったw
526: 2020/07/24(金)19:45 ID:lCl1FARv(1) AAS
GBレベルのファイルがオンメモリで処理できるわけないだろ。w
527: 2020/07/24(金)20:07 ID:iJ+2fZSI(1) AAS
メモリが1TBあればヘーキヘーキ
528: 2020/07/24(金)20:38 ID:So4dssPK(2/4) AAS
Stream 処理なら、バッファサイズ分のデータを、読んでは捨ててを繰り返すから、
必要なメモリサイズは、バッファサイズ分だけ

それか、seek みたいに、その番地をシークして、そこだけ書き換える
529: 511 2020/07/24(金)21:01 ID:So4dssPK(3/4) AAS
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個もあるの?

データ部分は固定サイズなの?
変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの?
530
(6): 2020/07/24(金)21:50 ID:EkE5sKTE(3/3) AAS
まーだやってたのか
>>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 にするかな
531: 511 2020/07/24(金)22:51 ID:So4dssPK(4/4) AAS
くれぐれも、データのバックアップを取っておいてから、実験しろよ。
もし、プログラムが間違っていたら、回復できないから

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

外部リンク[htm]:docstore.mik.ua
533: 532 2020/07/24(金)23:36 ID:Z8MDOpZc(2/4) AAS
>>530 と内容が被った…orz
534: 532 2020/07/24(金)23:40 ID:Z8MDOpZc(3/4) AAS
この辺調べてやってくだされぃ
外部リンク:www.google.co.jp
535: 532 2020/07/24(金)23:45 ID:Z8MDOpZc(4/4) AAS
先生ッ、便利そうなモジュール見つけました!
外部リンク:metacpan.org
536: 2020/07/24(金)23:46 ID:JRbdBOQM(9/10) AAS
>>530
検証に時間がかかってしまって返信遅くなりました
できました!! ありがとうございました!

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

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

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

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

例えば、300 × 100 / 1,000 = 30 %
539
(1): 2020/07/25(土)01:23 ID:c7rlqrmm(1) AAS
>>538
レスありがとうございます
本当にうれしいのですがド素人なので理解出来ないのです

>>530のコマンドラインに絡めるかスクリプトにしていただけると卒倒するほど喜びます
これを機会にperlを勉強したいと(心から)思いますが、今の段階ではこんな図々しいお願いをするしか出来ません
540
(1): 2020/07/25(土)02:26 ID:GJL3/5bG(1) AAS
もうええやろ?
541: 2020/07/26(日)01:36 ID:5SabrGL+(1) AAS
>>539
死ねよ
542: 2020/07/26(日)02:35 ID:T0U3lDAz(1) AAS
勉強する気はなしか
やれやれ
543: 2020/07/26(日)08:04 ID:faz+YmuJ(1/2) AAS
進捗表示は、計算自体は簡単だけど、ちゃんと見えるように表示するのが
ちょっと面倒なんだよな
544: 2020/07/26(日)10:44 ID:KWzmTFSY(1) AAS
好きなのを使えばいいよ。
外部リンク:metacpan.org
545: 2020/07/26(日)11:13 ID:faz+YmuJ(2/2) AAS
そんなもんがいちいちあるのか
まあ、凝ったことをするなら共通化はするだろうけど
凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、
UI特有の機能と関係ない面倒臭さの部分なんだよな
546: 2020/07/26(日)13:26 ID:y3z4IjvW(1) AAS
ターミナルの機能を使いきるなら面倒だろうけど、ただ垂れ流すだけなら簡単やろ。
547: 2020/07/26(日)18:32 ID:hRZi6+cn(1) AAS
>>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;
}
1-
あと 455 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.017s