[過去ログ]
Perlについての質問箱 64箱目 (1002レス)
Perlについての質問箱 64箱目 http://mevius.5ch.net/test/read.cgi/tech/1548981877/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
518: デフォルトの名無しさん [sage] 2020/07/24(金) 15:58:32.23 ID:JRbdBOQM >>517 レスありがとうございます 泣きそうです(解らなすぎて) >>509のスクリプトはバイナリ修正したコピーファイルを作成するものでした 小さなファイルなので問題ないのですが、目的の対象ファイルは10GB~20GBもあるものなのでマネ出来ません http://mevius.5ch.net/test/read.cgi/tech/1548981877/518
519: デフォルトの名無しさん [sage] 2020/07/24(金) 16:06:11.64 ID:JRbdBOQM >>509の全文です https://i.imgur.com/qOj8IAs.jpg 後出しのクセが強すぎすいません http://mevius.5ch.net/test/read.cgi/tech/1548981877/519
520: デフォルトの名無しさん [sage] 2020/07/24(金) 16:07:20.05 ID:UzZpGBU/ >>515 なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、 巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。 巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/520
521: デフォルトの名無しさん [sage] 2020/07/24(金) 16:48:28.89 ID:EkE5sKTE 直接書き換えたいならこんなとか? perl -e 'open F, "+< IN"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }' http://mevius.5ch.net/test/read.cgi/tech/1548981877/521
522: デフォルトの名無しさん [sage] 2020/07/24(金) 17:06:33.72 ID:61Z/1/Bp 別に短く書くコンテストではない http://mevius.5ch.net/test/read.cgi/tech/1548981877/522
523: デフォルトの名無しさん [] 2020/07/24(金) 17:06:42.97 ID:JRbdBOQM >>521 ありがとうございます Fはファイル名でよろしいでしょうか?(素人でごめんなさい) Can't find string terminator "'" anywhere before EOF at -e line 1. となります http://mevius.5ch.net/test/read.cgi/tech/1548981877/523
524: デフォルトの名無しさん [] 2020/07/24(金) 17:29:22.03 ID:JRbdBOQM サンプルです https://www.dropbox.com/s/zjhagi19dx0akbv/HR_STR01.SRO?dl=0 もしよろしければ暇つぶしに、ご指南いただけませんか? (もう、いただいてますけど) http://mevius.5ch.net/test/read.cgi/tech/1548981877/524
525: デフォルトの名無しさん [sage] 2020/07/24(金) 17:49:05.64 ID:JRbdBOQM よく考えたらダメだったw http://mevius.5ch.net/test/read.cgi/tech/1548981877/525
526: デフォルトの名無しさん [sage] 2020/07/24(金) 19:45:46.20 ID:lCl1FARv GBレベルのファイルがオンメモリで処理できるわけないだろ。w http://mevius.5ch.net/test/read.cgi/tech/1548981877/526
527: デフォルトの名無しさん [sage] 2020/07/24(金) 20:07:01.97 ID:iJ+2fZSI メモリが1TBあればヘーキヘーキ http://mevius.5ch.net/test/read.cgi/tech/1548981877/527
528: デフォルトの名無しさん [sage] 2020/07/24(金) 20:38:39.07 ID:So4dssPK Stream 処理なら、バッファサイズ分のデータを、読んでは捨ててを繰り返すから、 必要なメモリサイズは、バッファサイズ分だけ それか、seek みたいに、その番地をシークして、そこだけ書き換える http://mevius.5ch.net/test/read.cgi/tech/1548981877/528
529: 511 [sage] 2020/07/24(金) 21:01:04.13 ID: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個もあるの? データ部分は固定サイズなの? 変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの? http://mevius.5ch.net/test/read.cgi/tech/1548981877/529
530: デフォルトの名無しさん [sage] 2020/07/24(金) 21:50:07.62 ID: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 にするかな http://mevius.5ch.net/test/read.cgi/tech/1548981877/530
531: 511 [sage] 2020/07/24(金) 22:51:07.42 ID:So4dssPK くれぐれも、データのバックアップを取っておいてから、実験しろよ。 もし、プログラムが間違っていたら、回復できないから そもそも、他人のプログラムの意味が分からないのに、 それをそのまま実行するのは、非常に危険! http://mevius.5ch.net/test/read.cgi/tech/1548981877/531
532: 532 [sage] 2020/07/24(金) 23:35:26.56 ID:Z8MDOpZc Binary fileをupdateモードでopenして 目的の位置にseekしpackで元のファイルの内容を直接書き換える方法なら ttps://docstore.mik.ua/orelly/perl/cookbook/ch08_14.htm http://mevius.5ch.net/test/read.cgi/tech/1548981877/532
533: 532 [sage] 2020/07/24(金) 23:36:19.14 ID:Z8MDOpZc >>530 と内容が被った…orz http://mevius.5ch.net/test/read.cgi/tech/1548981877/533
534: 532 [sage] 2020/07/24(金) 23:40:56.85 ID:Z8MDOpZc この辺調べてやってくだされぃ https://www.google.co.jp/search?q=perl+binary+file+update+open+seek+unpack http://mevius.5ch.net/test/read.cgi/tech/1548981877/534
535: 532 [sage] 2020/07/24(金) 23:45:28.89 ID:Z8MDOpZc 先生ッ、便利そうなモジュール見つけました! https://metacpan.org/pod/File::Binary http://mevius.5ch.net/test/read.cgi/tech/1548981877/535
536: デフォルトの名無しさん [] 2020/07/24(金) 23:46:10.28 ID:JRbdBOQM >>530 検証に時間がかかってしまって返信遅くなりました できました!! ありがとうございました! 推察の通りコマンドプロンプトでのエラーでした 本命のLinux(Ubuntu)の端末上からも書き換え成功しました 感謝です ほかの皆様もありがとうございました 不愉快に感じた方も多かったと思います ごめんなさい ここで「進捗状況表示(%)をさせるにはどうしたらいいですか?」とか聞くと嫌われることは、僕もいい大人なので知っています http://mevius.5ch.net/te
st/read.cgi/tech/1548981877/536
537: デフォルトの名無しさん [] 2020/07/24(金) 23:48:59.17 ID:JRbdBOQM >>532 親切にありがとうございます http://mevius.5ch.net/test/read.cgi/tech/1548981877/537
538: デフォルトの名無しさん [sage] 2020/07/25(土) 00:54:10.29 ID:uhXYZAuD 進捗状況を表示させるには、最初にファイルサイズを取得する。 そして、データを書き換えるたびに、現在のseek 番地を取得して、 現在のseek 番地 × 100 / ファイルサイズ 例えば、300 × 100 / 1,000 = 30 % http://mevius.5ch.net/test/read.cgi/tech/1548981877/538
539: デフォルトの名無しさん [sage] 2020/07/25(土) 01:23:46.28 ID:c7rlqrmm >>538 レスありがとうございます 本当にうれしいのですがド素人なので理解出来ないのです >>530のコマンドラインに絡めるかスクリプトにしていただけると卒倒するほど喜びます これを機会にperlを勉強したいと(心から)思いますが、今の段階ではこんな図々しいお願いをするしか出来ません http://mevius.5ch.net/test/read.cgi/tech/1548981877/539
540: デフォルトの名無しさん [sage] 2020/07/25(土) 02:26:21.46 ID:GJL3/5bG もうええやろ? http://mevius.5ch.net/test/read.cgi/tech/1548981877/540
541: デフォルトの名無しさん [sage] 2020/07/26(日) 01:36:51.87 ID:5SabrGL+ >>539 死ねよ http://mevius.5ch.net/test/read.cgi/tech/1548981877/541
542: デフォルトの名無しさん [sage] 2020/07/26(日) 02:35:47.46 ID:T0U3lDAz 勉強する気はなしか やれやれ http://mevius.5ch.net/test/read.cgi/tech/1548981877/542
543: デフォルトの名無しさん [sage] 2020/07/26(日) 08:04:49.79 ID:faz+YmuJ 進捗表示は、計算自体は簡単だけど、ちゃんと見えるように表示するのが ちょっと面倒なんだよな http://mevius.5ch.net/test/read.cgi/tech/1548981877/543
544: デフォルトの名無しさん [sage] 2020/07/26(日) 10:44:31.12 ID:KWzmTFSY 好きなのを使えばいいよ。 https://metacpan.org/search?q=progress+bar http://mevius.5ch.net/test/read.cgi/tech/1548981877/544
545: デフォルトの名無しさん [sage] 2020/07/26(日) 11:13:19.32 ID:faz+YmuJ そんなもんがいちいちあるのか まあ、凝ったことをするなら共通化はするだろうけど 凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、 UI特有の機能と関係ない面倒臭さの部分なんだよな http://mevius.5ch.net/test/read.cgi/tech/1548981877/545
546: デフォルトの名無しさん [sage] 2020/07/26(日) 13:26:52.37 ID:y3z4IjvW ターミナルの機能を使いきるなら面倒だろうけど、ただ垂れ流すだけなら簡単やろ。 http://mevius.5ch.net/test/read.cgi/tech/1548981877/546
547: デフォルトの名無しさん [] 2020/07/26(日) 18:32:06.33 ID: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; } http://mevius.5ch.net/test/read.cgi/tech/1548981877/547
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 455 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.020s