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/
Perlについての質問箱 64箱目
■ このスレッドは過去ログ倉庫に格納されています
2019/02/01(金) 09:44:37.18ID:1/Kr4Qjk
457デフォルトの名無しさん
2020/06/11(木) 20:13:03.35ID:5cioSHJn >>454
レスありがとうございます。
「もとの値に戻る」と言う事は、a.plから参照される異なるスコープのb.pmがあり、
b.pmに「local $| = 1;」の記述があった場合、
b.pmに定義されたサブルーチンが呼び出される毎に、
「$| = 1;」と同等の処理が行われ、
戻る際には元の値がセットされるのでしょうか?
それとも、スコープによって異なる「$|」を、
標準出力側でスコープ毎に切り替えてるという事でしょうか?
レスありがとうございます。
「もとの値に戻る」と言う事は、a.plから参照される異なるスコープのb.pmがあり、
b.pmに「local $| = 1;」の記述があった場合、
b.pmに定義されたサブルーチンが呼び出される毎に、
「$| = 1;」と同等の処理が行われ、
戻る際には元の値がセットされるのでしょうか?
それとも、スコープによって異なる「$|」を、
標準出力側でスコープ毎に切り替えてるという事でしょうか?
458デフォルトの名無しさん
2020/06/11(木) 20:24:12.92ID:L2GhQgnz printする度に今見えてる$|が渡ってるんだろうな
459デフォルトの名無しさん
2020/06/11(木) 21:09:21.20ID:5cioSHJn460デフォルトの名無しさん
2020/06/11(木) 22:40:57.89ID:zOJFiWlV461デフォルトの名無しさん
2020/06/12(金) 02:39:58.45ID:TN61WwYv 宜しくお願いします。
$1をクリアしたい場合は「'' =~ /()/;」等として
無駄なマッチングをして空文字列を設定しないとダメですか?
数億件のデータを捌く際とか、めちゃくちゃタイムロスになりますよね?
皆様はどうされてるのでしょう?
$1をクリアしたい場合は「'' =~ /()/;」等として
無駄なマッチングをして空文字列を設定しないとダメですか?
数億件のデータを捌く際とか、めちゃくちゃタイムロスになりますよね?
皆様はどうされてるのでしょう?
462461
2020/06/12(金) 02:41:54.90ID:TN61WwYv463540
2020/06/12(金) 02:51:00.48ID:OceO7BHX >>461
まず、scalar変数の場合
=()はできない
=''や""は明示的に空文字列を設定することになる
なので既存変数をクリア、というか不定状態に設定するには
= undef;
あるいは数値を設定するためのシンボルを値0に戻すには
= 0;
undefは値として評価されれれば0,文字列として評価割れれば空文字列''が返った
(と思う)
まず、scalar変数の場合
=()はできない
=''や""は明示的に空文字列を設定することになる
なので既存変数をクリア、というか不定状態に設定するには
= undef;
あるいは数値を設定するためのシンボルを値0に戻すには
= 0;
undefは値として評価されれれば0,文字列として評価割れれば空文字列''が返った
(と思う)
464デフォルトの名無しさん
2020/06/12(金) 03:17:40.95ID:O2sQpJVa 答えではないのだけれど、そういう場面に遭遇したことがないんだよね
簡単でいいのでどんな時に必要なのかしら?
簡単でいいのでどんな時に必要なのかしら?
465461
2020/06/12(金) 03:24:01.31ID:TN61WwYv466461
2020/06/12(金) 03:52:20.68ID:TN61WwYv >>464
計 数億件のデータがあり、
それぞれにはCのラベルのような項目名がありまして、
それに続く文字列がその項目の値になるのですが、
(例えば「name: value…\n」な感じです)
これを一時的にDBに収めるためnameをキーとしてライブラリに渡したいんです。
一般的に思いつく方法としては、
「if( $ln =~ /^(パターン)://g ){ func( $1, $ln ); … }」
とすれば良いのですが、
なにせ件数が多いので、無駄な条件文を省きたいのです。
(条件文は処理が重いので)
検証実測値では1日以上の処理速度差がでるかもなのです。
(他にも同等の処理があるのでかなり省ける感じがするんです)
func()は、キーや値が未定義値もしくは空値であれば、
なにも処理をせず抜けるので、
$1がクリアできればif文を無くすことが出来ます。
そこで思いついたのが、
>>461の「'' =~ /()/;」ですが、これでは本末転倒です。
と言うのが経緯です。
計 数億件のデータがあり、
それぞれにはCのラベルのような項目名がありまして、
それに続く文字列がその項目の値になるのですが、
(例えば「name: value…\n」な感じです)
これを一時的にDBに収めるためnameをキーとしてライブラリに渡したいんです。
一般的に思いつく方法としては、
「if( $ln =~ /^(パターン)://g ){ func( $1, $ln ); … }」
とすれば良いのですが、
なにせ件数が多いので、無駄な条件文を省きたいのです。
(条件文は処理が重いので)
検証実測値では1日以上の処理速度差がでるかもなのです。
(他にも同等の処理があるのでかなり省ける感じがするんです)
func()は、キーや値が未定義値もしくは空値であれば、
なにも処理をせず抜けるので、
$1がクリアできればif文を無くすことが出来ます。
そこで思いついたのが、
>>461の「'' =~ /()/;」ですが、これでは本末転倒です。
と言うのが経緯です。
467デフォルトの名無しさん
2020/06/12(金) 04:05:50.63ID:Cyxf//AW468デフォルトの名無しさん
2020/06/12(金) 04:13:00.69ID:Cyxf//AW あら、いきちがった。。。
そういう話であれば、気にするな、ってところやろ。w
オレの感覚では、ifで判定して関数を呼び出さないほうが速そうだと思うがなあ。
Perlの処理としては、関数からすぐ戻ると言っても、呼び出しもそこからの戻りもそんなに軽くはなかったような。
「かも」とか言ってないで、真剣ならまず計測してみろ。
そういう話であれば、気にするな、ってところやろ。w
オレの感覚では、ifで判定して関数を呼び出さないほうが速そうだと思うがなあ。
Perlの処理としては、関数からすぐ戻ると言っても、呼び出しもそこからの戻りもそんなに軽くはなかったような。
「かも」とか言ってないで、真剣ならまず計測してみろ。
469デフォルトの名無しさん
2020/06/12(金) 05:15:54.75ID:O2sQpJVa 説明してくれたけど、やっぱイマイチ分からん
$1をクリアして無条件でfunc( $1, $ln )を呼び出したい、ということかしら
その時funcは通過するだけ、と
パフォーマンスを気にするならやっぱり $1 && func( $1, $ln )とかの方がいいと思うけどな
多分、何か事情があるのでしょう。
美しくはないけど'' =~ /()/;なら誤差の範疇と思いますよ。
数値としてはベンチマークで
$1をクリアして無条件でfunc( $1, $ln )を呼び出したい、ということかしら
その時funcは通過するだけ、と
パフォーマンスを気にするならやっぱり $1 && func( $1, $ln )とかの方がいいと思うけどな
多分、何か事情があるのでしょう。
美しくはないけど'' =~ /()/;なら誤差の範疇と思いますよ。
数値としてはベンチマークで
470デフォルトの名無しさん
2020/06/12(金) 05:31:29.45ID:P559B0Rd $1をやめる選択肢は?
($label) = $ln =~ /^(パターン)://;
func($label, $ln);
($label) = $ln =~ /^(パターン)://;
func($label, $ln);
471デフォルトの名無しさん
2020/06/12(金) 05:32:22.97ID:P559B0Rd あ、/ 多い……
472デフォルトの名無しさん
2020/06/12(金) 05:38:56.76ID:O2sQpJVa 答えじゃないんだけどさ、
$x = $ln =~ /^(パターン):/ && $1
これで以降は$xを使う、とか。
$x = $ln =~ /^(パターン):/ && $1
これで以降は$xを使う、とか。
473デフォルトの名無しさん
2020/06/12(金) 05:48:44.96ID:P559B0Rd え、array使わないの?
俺としては
($label) = $ln =~ /^(パターン):/;
func($label, $ln) if $label;
を推したい
俺としては
($label) = $ln =~ /^(パターン):/;
func($label, $ln) if $label;
を推したい
474デフォルトの名無しさん
2020/06/12(金) 07:57:32.00ID:kFexpNJ3 Ruby で特殊変数などは、スレッドローカル変数だから、
マルチスレッドでも共有しないから、安全だけど
特殊変数をクリアする必要など、考えたこともない
マルチスレッドでも共有しないから、安全だけど
特殊変数をクリアする必要など、考えたこともない
475デフォルトの名無しさん
2020/06/12(金) 09:26:27.43ID:Xic6e0Vs マッチに失敗してるのに古い$1を使ってしまって、
みたいなケースはちょいちょいあるな
それはクリアしてなかったからではなくて、失敗をトラップしてないバグ
みたいなケースはちょいちょいあるな
それはクリアしてなかったからではなくて、失敗をトラップしてないバグ
476デフォルトの名無しさん
2020/06/12(金) 13:25:45.07ID:Qkj+08r5477デフォルトの名無しさん
2020/06/12(金) 13:29:01.14ID:Qkj+08r5 速くしたいなら正規表現でマッチするかどうかなんてことやることそのものが間違いだとも思える。
同じPerl使うのであってもindex関数使うとか、他にやりようがあるんじゃないか?
同じPerl使うのであってもindex関数使うとか、他にやりようがあるんじゃないか?
478デフォルトの名無しさん
2020/06/12(金) 14:03:27.64ID:Xic6e0Vs 大量のデータを効率よく扱うのは、データベース構築するのが正解
個人が扱う範囲だと、テキストで持って全検索で困らないけど、
量が増えるとそのうち破綻する
個人が扱う範囲だと、テキストで持って全検索で困らないけど、
量が増えるとそのうち破綻する
479デフォルトの名無しさん
2020/06/12(金) 14:24:52.04ID:uUh54YqY >466
$ln =~ /^(パターン):|(.*?)/
にすると、「^(パターン):」にマッチしないときに$1を空文字にできる。
$ln =~ /^(パターン):|(.*?)/
にすると、「^(パターン):」にマッチしないときに$1を空文字にできる。
480デフォルトの名無しさん
2020/06/12(金) 14:50:38.25ID:uUh54YqY ただ、(試してはいないが)if文のオーバーヘッドより、
関数呼び出しのオーバーヘッドのほうが大きいと思うけどな。
関数呼び出しのオーバーヘッドのほうが大きいと思うけどな。
481デフォルトの名無しさん
2020/06/12(金) 15:40:26.50ID:bpI5hVyH そこまで速度に気にするならC++とかで書いた方がいい気がするね
482デフォルトの名無しさん
2020/06/17(水) 18:41:04.46ID:TVwLVBUa そんなデカいデータをよくパールでやるね。
C で書け。
C で書け。
483デフォルトの名無しさん
2020/06/28(日) 09:30:04.48ID:mI+4+ud7 https://developers.srad.jp/story/20/06/26/1324207/
> Perl 7が発表される。実質的にはPerl 5系のリネーム
> ストーリー by hylom 2020年06月26日 17時08分
> 現代における素人にはオススメできない言語 部門より
現代における素人にはオススメできない言語
…なら、文字列処理をやりたい素人は何を学べばいいの?
> Perl 7が発表される。実質的にはPerl 5系のリネーム
> ストーリー by hylom 2020年06月26日 17時08分
> 現代における素人にはオススメできない言語 部門より
現代における素人にはオススメできない言語
…なら、文字列処理をやりたい素人は何を学べばいいの?
484デフォルトの名無しさん
2020/06/28(日) 11:26:26.20ID:OE2OIMMC 5の後継なら7にする必要あるの?
485デフォルトの名無しさん
2020/06/28(日) 13:29:12.55ID:3gXsrtkR486デフォルトの名無しさん
2020/06/28(日) 18:17:09.91ID:UG2zXSFM お型付けできるようになったら嬉しいな
487デフォルトの名無しさん
2020/06/28(日) 19:55:20.21ID:DGGKS5Fb ついに後方互換捨てるのか!
488デフォルトの名無しさん
2020/07/02(木) 21:44:39.67ID:wuNvV9ki デフォルトの状態が変わるだけで
適宜オプションつければ後方互換も保てるらしいよ
Perlのこういうところ好きだわ
適宜オプションつければ後方互換も保てるらしいよ
Perlのこういうところ好きだわ
489デフォルトの名無しさん
2020/07/04(土) 13:31:08.07ID:yrmljXci 今のところは、な・・・
490デフォルトの名無しさん
2020/07/04(土) 18:51:36.50ID:25OQuAeP Perl7は進化を求める
この10年で完全にオワコン言語になってしまった
この10年で完全にオワコン言語になってしまった
491デフォルトの名無しさん
2020/07/04(土) 19:41:56.61ID:+vSKr8nf 効率化して高速化しようとしても、過去に足を引っ張られる
492デフォルトの名無しさん
2020/07/04(土) 19:48:46.40ID:VctW6lO7 単純に過去を切り捨てたら、Rakuの二の舞になる。過去を切り捨てるのであれば、
Python に勝てる程度の言語仕様にしなければ、見向きもされないだろう。
しかし、それはもう既にPerlではないだろう。
Python に勝てる程度の言語仕様にしなければ、見向きもされないだろう。
しかし、それはもう既にPerlではないだろう。
493デフォルトの名無しさん
2020/07/04(土) 20:01:08.35ID:XHKaM396 Perlはこのままでいいと思う
レガシーなのがPerlの強さ
レガシーなのがPerlの強さ
494デフォルトの名無しさん
2020/07/04(土) 20:55:27.14ID:+vSKr8nf negative legacy
495デフォルトの名無しさん
2020/07/05(日) 01:06:23.02ID:BkxIDrcL496デフォルトの名無しさん
2020/07/06(月) 00:05:12.58ID:Dee8Pqdl 逆に頑張って作ったPerl6が古いみたいな感じになっちゃうな(´・ω・`)
497デフォルトの名無しさん
2020/07/06(月) 02:55:32.01ID:pEZsiPGN もうPerl6は存在しないからだいじょうぶ。
498デフォルトの名無しさん
2020/07/06(月) 03:53:08.41ID:Lg+fAiJM Perl6はさっさと開発中止すべきだったのになぜ続行したんだろう
499デフォルトの名無しさん
2020/07/06(月) 19:42:39.82ID:5vDJxItj ま、いいじゃねえか。新しい言語が一つ増えたようなもんだし。
500デフォルトの名無しさん
2020/07/06(月) 21:20:03.77ID:pEZsiPGN501デフォルトの名無しさん
2020/07/07(火) 18:34:24.36ID:e1WbjzO/ うまくいくべき
502デフォルトの名無しさん
2020/07/07(火) 18:40:58.31ID:/oL+BKEU べきであるある
503デフォルトの名無しさん
2020/07/07(火) 18:42:17.26ID:v8PkKQM3504デフォルトの名無しさん
2020/07/07(火) 19:01:21.20ID:e1WbjzO/ 俺様
505デフォルトの名無しさん
2020/07/23(木) 01:04:36.09ID:2kWEZYuR ___________________________________________
/media/xxx/DVD_HDVR/HDVR_SOB/*.SRO
というのが動画本体で、
SROファイルの構造は
000000-00007F 東芝ヘッダ
000080-007FFF (データA)
008000-00807F 東芝ヘッダ
008080-00FFFF (データB)
010000-01007F 東芝ヘッダ
010080-01FFFF (データC)
となっていて、東芝ヘッダからみたオフセット0x1C番地にある0x40値を=>0x00に書き換えるそうです。
東芝ヘッダは1つのファイルに複数ある(?)そうで、それらすべてを書き換える必要があるようです
↑
これをperlスクリプトでお願いします
/media/xxx/DVD_HDVR/HDVR_SOB/*.SRO
というのが動画本体で、
SROファイルの構造は
000000-00007F 東芝ヘッダ
000080-007FFF (データA)
008000-00807F 東芝ヘッダ
008080-00FFFF (データB)
010000-01007F 東芝ヘッダ
010080-01FFFF (データC)
となっていて、東芝ヘッダからみたオフセット0x1C番地にある0x40値を=>0x00に書き換えるそうです。
東芝ヘッダは1つのファイルに複数ある(?)そうで、それらすべてを書き換える必要があるようです
↑
これをperlスクリプトでお願いします
506デフォルトの名無しさん
2020/07/23(木) 06:45:22.79ID:6LXR6fOg binmodeで開いて、substr
507デフォルトの名無しさん
2020/07/23(木) 19:03:52.69ID:2kWEZYuR508デフォルトの名無しさん
2020/07/23(木) 19:09:07.35ID:NaEhWCW1 コードそのものを書いてくれとさ
509デフォルトの名無しさん
2020/07/23(木) 19:25:52.21ID:2kWEZYuR 同じような目的の別のスクリプトです
これに近いイメージでしょうか
(全文書くとブロックされる)
_________________________________________________________
HR_MANGR.IFOのコピー禁止フラグ解除は、
0x20 0x2C 0x23のシーケンスを0x20 0x24 0x23 に変更
perlスクリプトの例は以下のとおり。
# freeifo.pl
# HR_MANGR.IFOの変換
use strict;
use warnings;
my $infile = "HR_MANGR.IFO";
my $buf;
my $sTarget = " ,#"; # 0x20 0x2C 0x23
# ファイルのオープン
# バイナリモードに変更
binmode INFILE;
binmode OUTFILE;
my $sizIFO = -s $infile;
# IFOファイルを読み込み
# 0x20 0x2C 0x23 の並びがあれば、0x20 0x24 0x23 に置き換え
#他にあれば継続、無ければ終了
# ファイルのクローズ
close INFILE;
close OUTFILE;
これに近いイメージでしょうか
(全文書くとブロックされる)
_________________________________________________________
HR_MANGR.IFOのコピー禁止フラグ解除は、
0x20 0x2C 0x23のシーケンスを0x20 0x24 0x23 に変更
perlスクリプトの例は以下のとおり。
# freeifo.pl
# HR_MANGR.IFOの変換
use strict;
use warnings;
my $infile = "HR_MANGR.IFO";
my $buf;
my $sTarget = " ,#"; # 0x20 0x2C 0x23
# ファイルのオープン
# バイナリモードに変更
binmode INFILE;
binmode OUTFILE;
my $sizIFO = -s $infile;
# IFOファイルを読み込み
# 0x20 0x2C 0x23 の並びがあれば、0x20 0x24 0x23 に置き換え
#他にあれば継続、無ければ終了
# ファイルのクローズ
close INFILE;
close OUTFILE;
510デフォルトの名無しさん
2020/07/24(金) 04:55:58.03ID:6ZonvnML そうそう。そんな感じ。
まあ頑張って。
まあ頑張って。
511デフォルトの名無しさん
2020/07/24(金) 09:07:49.48ID:So4dssPK 書き換える番地は、N は、0 以上で、以下の法則か?
0x8000 × N + ( 0x80 + 0x1C )
つまり、ヘッダは必ず、0x8000 毎にあるのか?
0x8000 × N + ( 0x80 + 0x1C )
つまり、ヘッダは必ず、0x8000 毎にあるのか?
512デフォルトの名無しさん
2020/07/24(金) 11:24:40.72ID:JRbdBOQM >>511
レスありがとうございます
________________________________________________
SROファイルの書き換え
000000-00007F 東芝ヘッダ
000080-007FFF (データA)
008000-00807F 東芝ヘッダ
008080-00FFFF (データB)
010000-01007F 東芝ヘッダ
010080-01FFFF (データC)
というふうに、0x8000バイトで1セットとなっている。
東芝ヘッダとは、0x80バイトからなるデータブロック。途中に## Toshiba 〜という文字列を含んでいる
東芝ヘッダのコピー禁止フラグ(CPP)のあるオフセット0x1Cを 0x40 ⇒ 0x00 に修正。
レスありがとうございます
________________________________________________
SROファイルの書き換え
000000-00007F 東芝ヘッダ
000080-007FFF (データA)
008000-00807F 東芝ヘッダ
008080-00FFFF (データB)
010000-01007F 東芝ヘッダ
010080-01FFFF (データC)
というふうに、0x8000バイトで1セットとなっている。
東芝ヘッダとは、0x80バイトからなるデータブロック。途中に## Toshiba 〜という文字列を含んでいる
東芝ヘッダのコピー禁止フラグ(CPP)のあるオフセット0x1Cを 0x40 ⇒ 0x00 に修正。
513デフォルトの名無しさん
2020/07/24(金) 11:37:31.23ID:nuOKXnku オレなら、バイナリーエディタの置換機能を使うと思うが。
514デフォルトの名無しさん
2020/07/24(金) 11:40:12.29ID:61Z/1/Bp 数が多いとツール作った方が早い
手動でやってもツール作っても時間同じなら、ツール作った方がいい
仕事では、ツール作ったせいで余計に時間かかってもツール作る
手動でやってもツール作っても時間同じなら、ツール作った方がいい
仕事では、ツール作ったせいで余計に時間かかってもツール作る
515デフォルトの名無しさん
2020/07/24(金) 11:53:07.60ID:JRbdBOQM >>513
データが大きいのでLinuxのバイナリエディタでは上手く行かないのです
データが大きいのでLinuxのバイナリエディタでは上手く行かないのです
516デフォルトの名無しさん
2020/07/24(金) 12:54:55.96ID:JRbdBOQM517デフォルトの名無しさん
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
これが最短?
これが最短?
518デフォルトの名無しさん
2020/07/24(金) 15:58:32.23ID:JRbdBOQM519デフォルトの名無しさん
2020/07/24(金) 16:06:11.64ID:JRbdBOQM520デフォルトの名無しさん
2020/07/24(金) 16:07:20.05ID:UzZpGBU/ >>515
なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、
巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。
巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。
なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、
巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。
巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。
521デフォルトの名無しさん
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 }'
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:33.72ID:61Z/1/Bp 別に短く書くコンテストではない
523デフォルトの名無しさん
2020/07/24(金) 17:06:42.97ID:JRbdBOQM >>521
ありがとうございます
Fはファイル名でよろしいでしょうか?(素人でごめんなさい)
Can't find string terminator "'" anywhere before EOF at -e line 1.
となります
ありがとうございます
Fはファイル名でよろしいでしょうか?(素人でごめんなさい)
Can't find string terminator "'" anywhere before EOF at -e line 1.
となります
524デフォルトの名無しさん
2020/07/24(金) 17:29:22.03ID:JRbdBOQM サンプルです
https://www.dropbox.com/s/zjhagi19dx0akbv/HR_STR01.SRO?dl=0
もしよろしければ暇つぶしに、ご指南いただけませんか?
(もう、いただいてますけど)
https://www.dropbox.com/s/zjhagi19dx0akbv/HR_STR01.SRO?dl=0
もしよろしければ暇つぶしに、ご指南いただけませんか?
(もう、いただいてますけど)
525デフォルトの名無しさん
2020/07/24(金) 17:49:05.64ID:JRbdBOQM よく考えたらダメだったw
526デフォルトの名無しさん
2020/07/24(金) 19:45:46.20ID:lCl1FARv GBレベルのファイルがオンメモリで処理できるわけないだろ。w
527デフォルトの名無しさん
2020/07/24(金) 20:07:01.97ID:iJ+2fZSI メモリが1TBあればヘーキヘーキ
528デフォルトの名無しさん
2020/07/24(金) 20:38:39.07ID:So4dssPK Stream 処理なら、バッファサイズ分のデータを、読んでは捨ててを繰り返すから、
必要なメモリサイズは、バッファサイズ分だけ
それか、seek みたいに、その番地をシークして、そこだけ書き換える
必要なメモリサイズは、バッファサイズ分だけ
それか、seek みたいに、その番地をシークして、そこだけ書き換える
529511
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個もあるの?
データ部分は固定サイズなの?
変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの?
(ただし、Kib は、1,000 倍ではなく、1,024 倍)
32 KiB * 32 個 = 1 MiB
1 GiB なら、 32個 * 1,024 = 32,768個
10GiB なら、0x8000サイズのブロックが、327,680個もあるの?
データ部分は固定サイズなの?
変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの?
530デフォルトの名無しさん
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 にするかな
>>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 にするかな
531511
2020/07/24(金) 22:51:07.42ID:So4dssPK くれぐれも、データのバックアップを取っておいてから、実験しろよ。
もし、プログラムが間違っていたら、回復できないから
そもそも、他人のプログラムの意味が分からないのに、
それをそのまま実行するのは、非常に危険!
もし、プログラムが間違っていたら、回復できないから
そもそも、他人のプログラムの意味が分からないのに、
それをそのまま実行するのは、非常に危険!
532532
2020/07/24(金) 23:35:26.56ID:Z8MDOpZc Binary fileをupdateモードでopenして
目的の位置にseekしpackで元のファイルの内容を直接書き換える方法なら
ttps://docstore.mik.ua/orelly/perl/cookbook/ch08_14.htm
目的の位置にseekしpackで元のファイルの内容を直接書き換える方法なら
ttps://docstore.mik.ua/orelly/perl/cookbook/ch08_14.htm
534532
2020/07/24(金) 23:40:56.85ID:Z8MDOpZc535532
2020/07/24(金) 23:45:28.89ID:Z8MDOpZc 先生ッ、便利そうなモジュール見つけました!
https://metacpan.org/pod/File::Binary
https://metacpan.org/pod/File::Binary
536デフォルトの名無しさん
2020/07/24(金) 23:46:10.28ID:JRbdBOQM >>530
検証に時間がかかってしまって返信遅くなりました
できました!! ありがとうございました!
推察の通りコマンドプロンプトでのエラーでした
本命のLinux(Ubuntu)の端末上からも書き換え成功しました
感謝です
ほかの皆様もありがとうございました
不愉快に感じた方も多かったと思います ごめんなさい
ここで「進捗状況表示(%)をさせるにはどうしたらいいですか?」とか聞くと嫌われることは、僕もいい大人なので知っています
検証に時間がかかってしまって返信遅くなりました
できました!! ありがとうございました!
推察の通りコマンドプロンプトでのエラーでした
本命のLinux(Ubuntu)の端末上からも書き換え成功しました
感謝です
ほかの皆様もありがとうございました
不愉快に感じた方も多かったと思います ごめんなさい
ここで「進捗状況表示(%)をさせるにはどうしたらいいですか?」とか聞くと嫌われることは、僕もいい大人なので知っています
537デフォルトの名無しさん
2020/07/24(金) 23:48:59.17ID:JRbdBOQM >>532
親切にありがとうございます
親切にありがとうございます
538デフォルトの名無しさん
2020/07/25(土) 00:54:10.29ID:uhXYZAuD 進捗状況を表示させるには、最初にファイルサイズを取得する。
そして、データを書き換えるたびに、現在のseek 番地を取得して、
現在のseek 番地 × 100 / ファイルサイズ
例えば、300 × 100 / 1,000 = 30 %
そして、データを書き換えるたびに、現在のseek 番地を取得して、
現在のseek 番地 × 100 / ファイルサイズ
例えば、300 × 100 / 1,000 = 30 %
539デフォルトの名無しさん
2020/07/25(土) 01:23:46.28ID:c7rlqrmm540デフォルトの名無しさん
2020/07/25(土) 02:26:21.46ID:GJL3/5bG もうええやろ?
541デフォルトの名無しさん
2020/07/26(日) 01:36:51.87ID:5SabrGL+ >>539
死ねよ
死ねよ
542デフォルトの名無しさん
2020/07/26(日) 02:35:47.46ID:T0U3lDAz 勉強する気はなしか
やれやれ
やれやれ
543デフォルトの名無しさん
2020/07/26(日) 08:04:49.79ID:faz+YmuJ 進捗表示は、計算自体は簡単だけど、ちゃんと見えるように表示するのが
ちょっと面倒なんだよな
ちょっと面倒なんだよな
544デフォルトの名無しさん
2020/07/26(日) 10:44:31.12ID:KWzmTFSY 好きなのを使えばいいよ。
https://metacpan.org/search?q=progress+bar
https://metacpan.org/search?q=progress+bar
545デフォルトの名無しさん
2020/07/26(日) 11:13:19.32ID:faz+YmuJ そんなもんがいちいちあるのか
まあ、凝ったことをするなら共通化はするだろうけど
凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、
UI特有の機能と関係ない面倒臭さの部分なんだよな
まあ、凝ったことをするなら共通化はするだろうけど
凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、
UI特有の機能と関係ない面倒臭さの部分なんだよな
546デフォルトの名無しさん
2020/07/26(日) 13:26:52.37ID:y3z4IjvW ターミナルの機能を使いきるなら面倒だろうけど、ただ垂れ流すだけなら簡単やろ。
547デフォルトの名無しさん
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;
}
最適化するとすると手順はこんな感じかな。
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;
}
548デフォルトの名無しさん
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 }
みなさんありがとう
し、進捗。。。
----------------------------------------------------------------
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 }
549デフォルトの名無しさん
2020/07/27(月) 01:28:37.03ID:KvYX/iYh >>548
いい加減にしろ
いい加減にしろ
550デフォルトの名無しさん
2020/07/27(月) 07:32:32.55ID:X6EMHfht readして変更しないところまでprintするのは無駄なのに
無駄を省けば進捗表示がいらないくらい高速化するだろうに
無駄を省けば進捗表示がいらないくらい高速化するだろうに
551デフォルトの名無しさん
2020/07/27(月) 09:23:37.46ID:HYhflFVx コピーを作っておいて、そのコピーの一部だけ変更して書き戻せば一瞬
信頼性が上がったら、コピーは作らずにオリジナルを変更する
信頼性が上がったら、コピーは作らずにオリジナルを変更する
552デフォルトの名無しさん
2020/07/27(月) 10:25:37.74ID:URSuW3yQ >>550
ファイルサイズがGBレベルなら、そんなに速くはならんやろ。
ファイルサイズがGBレベルなら、そんなに速くはならんやろ。
553デフォルトの名無しさん
2020/07/27(月) 17:35:52.14ID:X6EMHfht554デフォルトの名無しさん
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では認識できないのです
約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では認識できないのです
555デフォルトの名無しさん
2020/07/27(月) 19:14:13.61ID:KvYX/iYh DRM解除の片棒担ぐ人達かね
556デフォルトの名無しさん
2020/07/27(月) 19:33:35.94ID:HYhflFVx なんて大層なDRMだ
557デフォルトの名無しさん
2020/07/27(月) 19:46:48.42ID:Y15FmTu1 残念ながら暗号化解除まではされないんです
別の機器にコピーしようとしても「コピープロテクトがなんちゃら。。」と、ちゃんとハネられます
機器内の制限を緩くするためのオフホワイトな作業です
別の機器にコピーしようとしても「コピープロテクトがなんちゃら。。」と、ちゃんとハネられます
機器内の制限を緩くするためのオフホワイトな作業です
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 日本損失1.7兆円に修正 中国渡航自粛の影響試算 [蚤の市★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- 「アベノミクス」で投資対象と化したマンション ローンの低金利続き「年収の12倍」借りる20代出現 [蚤の市★]
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 台湾「高市さんが台湾人の悲願を叶えてくれた!」これじゃ高市さん発言撤回できないぢゃん😰 [523957489]
- 【実況】博衣こよりのえちえち朝こよ🧪
- 高市周辺、さすがに焦り始めるww「小さな火種が火事になりかけている。早く鎮火しなくてはいけない」 [271912485]
- 【高市悲報】神谷「部下が間違えて脱炭素を脱酸素て書いたんですよ😡それ読んだだけなのに挙げ足とるな!小学生か!」 [359965264]
- 【超悲報】中国への武力行使、世論調査で「賛成」「どちらかといえば賛成」48.8% 「反対」「どちらかといえば反対」の44.2%を上回る [314039747]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
