Perlについての質問箱 64箱目
■ このスレッドは過去ログ倉庫に格納されています
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/ 数が多いとツール作った方が早い
手動でやってもツール作っても時間同じなら、ツール作った方がいい
仕事では、ツール作ったせいで余計に時間かかってもツール作る >>513
データが大きいのでLinuxのバイナリエディタでは上手く行かないのです https://i.imgur.com/Y6NhiUE.jpg
この文字列が一定間隔で現れます
データが大きいので>>514さんの言うとおりツール(スクリプト)で処理したいのです perl -e "binmode STDIN; binmode STDOUT; while (read STDIN, $_, 0x8000) { substr $_, 0x1c, 1, 0; print }" < IN > OUT
これが最短? >>517
レスありがとうございます
泣きそうです(解らなすぎて)
>>509のスクリプトはバイナリ修正したコピーファイルを作成するものでした
小さなファイルなので問題ないのですが、目的の対象ファイルは10GB~20GBもあるものなのでマネ出来ません >>515
なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、
巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。
巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。 直接書き換えたいならこんなとか?
perl -e 'open F, "+< IN"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0";
seek F, -$l, 1; print F }' >>521
ありがとうございます
Fはファイル名でよろしいでしょうか?(素人でごめんなさい)
Can't find string terminator "'" anywhere before EOF at -e line 1.
となります GBレベルのファイルがオンメモリで処理できるわけないだろ。w Stream 処理なら、バッファサイズ分のデータを、読んでは捨ててを繰り返すから、
必要なメモリサイズは、バッファサイズ分だけ
それか、seek みたいに、その番地をシークして、そこだけ書き換える 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個もあるの?
データ部分は固定サイズなの?
変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの? まーだやってたのか
>>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 にするかな くれぐれも、データのバックアップを取っておいてから、実験しろよ。
もし、プログラムが間違っていたら、回復できないから
そもそも、他人のプログラムの意味が分からないのに、
それをそのまま実行するのは、非常に危険! Binary fileをupdateモードでopenして
目的の位置にseekしpackで元のファイルの内容を直接書き換える方法なら
ttps://docstore.mik.ua/orelly/perl/cookbook/ch08_14.htm >>530
検証に時間がかかってしまって返信遅くなりました
できました!! ありがとうございました!
推察の通りコマンドプロンプトでのエラーでした
本命のLinux(Ubuntu)の端末上からも書き換え成功しました
感謝です
ほかの皆様もありがとうございました
不愉快に感じた方も多かったと思います ごめんなさい
ここで「進捗状況表示(%)をさせるにはどうしたらいいですか?」とか聞くと嫌われることは、僕もいい大人なので知っています 進捗状況を表示させるには、最初にファイルサイズを取得する。
そして、データを書き換えるたびに、現在のseek 番地を取得して、
現在のseek 番地 × 100 / ファイルサイズ
例えば、300 × 100 / 1,000 = 30 % >>538
レスありがとうございます
本当にうれしいのですがド素人なので理解出来ないのです
>>530のコマンドラインに絡めるかスクリプトにしていただけると卒倒するほど喜びます
これを機会にperlを勉強したいと(心から)思いますが、今の段階ではこんな図々しいお願いをするしか出来ません 進捗表示は、計算自体は簡単だけど、ちゃんと見えるように表示するのが
ちょっと面倒なんだよな そんなもんがいちいちあるのか
まあ、凝ったことをするなら共通化はするだろうけど
凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、
UI特有の機能と関係ない面倒臭さの部分なんだよな ターミナルの機能を使いきるなら面倒だろうけど、ただ垂れ流すだけなら簡単やろ。 >>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;
} >>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 } readして変更しないところまでprintするのは無駄なのに
無駄を省けば進捗表示がいらないくらい高速化するだろうに コピーを作っておいて、そのコピーの一部だけ変更して書き戻せば一瞬
信頼性が上がったら、コピーは作らずにオリジナルを変更する >>550
ファイルサイズがGBレベルなら、そんなに速くはならんやろ。 ていうか >>548 は >>530 を参考にしてるのになんで遅い方を使ってるんだ 呼ばれた気がしたので
約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では認識できないのです 残念ながら暗号化解除まではされないんです
別の機器にコピーしようとしても「コピープロテクトがなんちゃら。。」と、ちゃんとハネられます
機器内の制限を緩くするためのオフホワイトな作業です >>559
理由は関係ないはず
秘匿目的で暗号化されているものを解読することそのものが犯罪 >>557
お前は裁判になって負けたら責任全部背負うのか? 自称”法律専門家”の底辺ニート達が不毛な議論を展開すると予想 コピー許可するフラグをいじるのは私的利用の範囲なら自由じゃないですか?
ここでその方法を聞いたりその答えを書いたりした人がどうなるかはわかりませんが >>567
他人が使うためにプログラムを公開することに問題がないとでも? Winnyの作者は捕まるが利用者は捕まらない
包丁の販売は捕まらないか利用者は捕まる事が有る
YouTubeであるけど包丁を自作して販売したら捕まるのか? >>568
コピー許可フラグを取り除くプログラムを公開することは問題ありと見ているわけですね
確かに東芝の全機種に対して動作可能であるなら影響は大きそうです おかしな雲行きになってきたので説明(釈明)を
まず第一に、このスクリプトだけでは目的を達成することができません
いくつか別ファイルを修正する必要があります
当然ながらこのスレではそれらは公開されていません
不完全な変なデータが出来上がるだけです
第二にこの手法が通用するのは、10年以上前に発売された「ある機種」のみです
次機種以降ではこの"バグ"はすっかり塞がれました
ディスクの中身をこれほどたやすく弄れるなんて話は聞いたことがないです
今現在どれほどの人がこの機種を使っているか知りませんが。。。
そしてこれは「暗号化解除」を目的としていません
ヘッダの一部分をちょっと弄っただけでプロテクトが外れるとか、幼稚園児ですか?
これはデータを細工して機器を「騙している」にすぎません 「暗号化解除ではない」と書いているのに裁判(w)とか責任(w)とか言ってる人って
字が読めないのか、頭が悪くて理解できないのか、あるいは目が見えないのか
10年前も当時の2ちゃんねる()で話題になって多くのスクリプトやプログラムも配布されました
彼らは訴えられたのかなぁ?心配です(棒
ついでに言えば
実は>>530は私です
壮大な自作自演です(今時)
進捗表示を教えてほしかっただけなのです。。。
みなさん釣り堀へようこそ
そして農家の朝は早い それでは最後に
普段から社会にこれっぽっちも貢献してないくせに、こんな匿名掲示板で妙な倫理観や底が浅い正義感を振りかざすとか
以降、間抜けな人たちの「負け惜しみ」のレスが続きます
屁理屈、論点ずらし、人格否定など、つたない書き込みをしばらくの間お楽しみください
合わせて「おかしな雲行き まで読んだ」もお楽しみください 釣り堀する前に、Linuxインストールできるようになれよ。 Linuxで思い出したが、最新のUbuntuとかでは(仕様変更で)その機種の外付けHDDを「書き込み可」
でマウントできない
手動で”-RW”オプション付けてマウントしようとしてもダメ
書き込みできないからスクリプトもエラーになる
仕方ないのでUDF関連のソースファイルを弄ってカーネルをコンパイルしている
多分世界で私だけだと思う(そんな需要があるわけない)
>>574
頑張って パソコンはコマンドが基本だからな。
コマンド出来るようになれよ。 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毎に書く時に読むだろうからこんなもんか 約13GBのデータで(usb2.0)
2ch配布Linuxネイティブアプリ@10年前 64bit版
12m10.357s
Perlスクリプト readあり
12m5.101s
Perlスクリプト readなし
8m38.678s >>583
ネットでの暴言はインキャがすること。
てめぇはこうなれ!!!
http://re-file.com/18k/1669/ (結構グロ) 殺したいほど嫌悪するような事か?
おそらく心の病気だから早く病院行った方がいい >>585
あの〜傍観者なのですが、これって584と583
どっちに言ってるんですか?? ネットはこうでなくちゃ!明日の学校めんどいけど、この争いみたら
楽になれる! なぁお前らってホントにコード書けるの?
何でここにいるの? 明日の学校とか五十過ぎのオッサンが恥ずかしくないのか? >>590
福岡県福岡市東区在住
西南学院中学二年〇組テニス部
学力推移調査:225/223位
全教研赤坂本校筑女,西南合同vクラス
明日の時間割英会話.社会.聖書.体育
(保護者面談なので4限授業)
頭は悪いがプログラムができるのでマークザッカーバーグ
のように校内snsをつくって流行らせようとしてます笑笑。
昨日、無断で水曜日に部活休んだのでめちゃくちゃ怒鳴られました。
明日の聖書は、「手紙」というくだらない日本映画を見ます。
今日は一時から「爆笑問題カウボーイ」というラジオがあるので、
monsterのんでずっと起きてます。2年になって運が悪いことに親しかった
友達は2組と五組に分かれてしまい、僕だけ〇組という
辺境の地に飛ばされました笑笑。好きなアーティストは「ずっと真夜中でいいのに」
という顔出ししていないバンドです。さっき5chのずとまよ専用スレで顔写真をみて、
とても美人だったので今すごくうれしいです。好きなサイトは、「リファイル」というグロサイトです。
「西南学院中学2年という名前でコメント投稿してるので、グッドボタン押して下さい。 >>591
というか、こんなにネットにさらすのはやばかったかな? >>590
逆に聞きますが、あなた五十過ぎのオッサン
何ですか?( ´∀` ) >>593
リアル厨房なら、perlなんかやめたほうがいいね。
python のほうがずっと言語仕様が綺麗で、複雑な処理も簡単にこなせる。
今、perlを使っているのはな、20年前からperlを使ってて、
他の言語に乗り換える気力も失ったオッサンばっかりだよ。 >>597
最近はperlよりphpに力を入れてます >>597
互換性重視ならPerlしか。
Rubyはとんでもないし、Pythonもあやしい。 問題
----
$flags に格納されているフラグ 0x40 をリセットして 0x00 にする
次の3通りの処理から採用する方法を理由を添えて答えなさい
a. $flags = 0x00
b. $flags = 0x00 if $flags == 0x40
c. $flags &= ~0x40 でも、そこだけ書き換えて、ちゃんと動いたの?
もし、チェックサムがあれば、エラーになるはずだけど >>597
個人的にはサーバプログラムはgo
時点でpythonかな
perlはlinuxなら環境を選ばないという点で、シェルスクリプトはperl一択
それぞれに良さがある >>603
a, b は他のビットが0になっても良い場合、及びbは他のビットが0の場合に動く。
cは
あ、ちょっと今書いてる時間ない。誰か他の人よろしく。 Cは他のビットを崩さずに 0x40 の所のビット(2進だと01000000)だけ0にする。 何を 0x00 にするのか不明確な時点で出題者の頭が悪い。
a を意図しているなら 0x40 は関係ないし
b を意図しているなら「0x40 をリセットして」ではなく「0x40 がセットされていれば」と
書かれていなければならない。
ひょっとして、元の値が 0 だったらリセットしたことにはならないということか?
c を意図しているなら他のビットが全部 0 の場合に限り「$flags の値を 0x00 にする」
ことになるだろうが、そのようには書かれていない。
$flags & 0x40 を 0 にするということなら、 0x00 と表記するのは
値としては同じでも適切な表記なのか疑問が残る。
しかしこれが最も無理のない解釈だろう。
こんなに忖度させるようでは出題者は落第だ。 うわあ恥ずかしいやつが来ちゃった
>>603 は >>505 からの流れがあって出された問なのに・・・ pythonいいけどちゃんと書かないとすぐバグるから気をつけてな 水掛け論でしょ 言語仕様を理解しないで適当に書いてちゃんと動くかどうかの話 ■ このスレッドは過去ログ倉庫に格納されています