CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板: http://kohada.2ch.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.18.2)
▼前スレ
Perlについての質問箱 61箱目
http://toro.2ch.net/test/read.cgi/tech/1381561905/
Perlについての質問箱 62箱目
http://toro.2ch.net/test/read.cgi/tech/1385039352/
Perlについての質問箱 63箱目
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2014/02/19(水) 23:36:23.29151デフォルトの名無しさん
2016/05/03(火) 22:19:44.35ID:u2mE3+tw /[0-9]{$num}/
のような量子数は変数にできないんでしょうか?(^^?
のような量子数は変数にできないんでしょうか?(^^?
152デフォルトの名無しさん
2016/05/04(水) 01:44:17.76ID:eTkSZ25N # 実行してみて
for $num (1..3){
$_ = '1' x ($num - 1);
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
$_ = '1' x $num;
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 1);
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
print "\n";
}
for $num (1..3){
$_ = '1' x ($num - 1);
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
$_ = '1' x $num;
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 1);
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
print "\n";
}
153デフォルトの名無しさん
2016/05/04(水) 17:17:13.34ID:cuRcUS6e154デフォルトの名無しさん
2016/05/04(水) 22:28:29.07ID:0wPtL/Lt $n = 2;
$pat_qr = $n + 1;
$pat_qr = qr/[0-9]{$pat_qr}/ ;
$pat_ev = eval( sprintf("qr/[0-9]{%d}/",$n+1));
$pat_co = qr/(??{ sprintf("[0-9]{%d}",$n+1) })/ ;
print( $_,"\n") foreach $pat_qr,$pat_ev,$pat_co;
# 個人的には $pat_qr がいいなぁ。eval を使うほどのことじゃないし $pat_co はデバッグしにくい。
$pat_qr = $n + 1;
$pat_qr = qr/[0-9]{$pat_qr}/ ;
$pat_ev = eval( sprintf("qr/[0-9]{%d}/",$n+1));
$pat_co = qr/(??{ sprintf("[0-9]{%d}",$n+1) })/ ;
print( $_,"\n") foreach $pat_qr,$pat_ev,$pat_co;
# 個人的には $pat_qr がいいなぁ。eval を使うほどのことじゃないし $pat_co はデバッグしにくい。
155デフォルトの名無しさん
2016/05/05(木) 15:23:19.51ID:zs5en64n # こうですよ
for $num (1..3){
$_ = '1' x $num;
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 1);
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 2);
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
print "\n";
}
for $num (1..3){
$_ = '1' x $num;
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 1);
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 2);
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
print "\n";
}
157153
2016/05/05(木) 19:13:26.95ID:eJss6EWw あのあのもう一つ
ファイルハンドルで3行読み込むのを作ってみたのですがうまくいきませんでした…
どうしたらよいのでしょうか…
while ( $line[0..2] = <DATA> ) {
print $line[0];
print $line[1];
print $line[2];
}
__DATA__
なんたら
かんたら
たらのめ
ファイルハンドルで3行読み込むのを作ってみたのですがうまくいきませんでした…
どうしたらよいのでしょうか…
while ( $line[0..2] = <DATA> ) {
print $line[0];
print $line[1];
print $line[2];
}
__DATA__
なんたら
かんたら
たらのめ
158153
2016/05/05(木) 19:19:01.51ID:eJss6EWw ちょっとサンプル省略しすぎてすみません。
":encoding(cp932)"
等で漢字の表示は問題ありませんm(__)m
while ( $line[0] = <DATA> ) {
$line[1] = <DATA>;
$line[2] = <DATA>;
....
のように分解して書くと問題ありません。(DATAは必ず3行一組になります)
一度に、3行読み込む方法があればお教えくださいm(__)m
":encoding(cp932)"
等で漢字の表示は問題ありませんm(__)m
while ( $line[0] = <DATA> ) {
$line[1] = <DATA>;
$line[2] = <DATA>;
....
のように分解して書くと問題ありません。(DATAは必ず3行一組になります)
一度に、3行読み込む方法があればお教えくださいm(__)m
159デフォルトの名無しさん
2016/05/05(木) 21:40:51.68ID:AhXWZZ47 @line[0..2]
配列スライスのシジルは@
配列スライスのシジルは@
160デフォルトの名無しさん
2016/05/05(木) 23:21:34.59ID:zs5en64n 都合よく固定長を前提にはできないだろうから、
# 全部読んじゃって
chomp(@_ = <DATA>);
# 3つづつ処理する
while (@line = splice(@_,0,3)) {
print map {"[$_]"} @line;
print "\n";
}
__END__
1
2
3
4
5
6
7
8
9
# 全部読んじゃって
chomp(@_ = <DATA>);
# 3つづつ処理する
while (@line = splice(@_,0,3)) {
print map {"[$_]"} @line;
print "\n";
}
__END__
1
2
3
4
5
6
7
8
9
161デフォルトの名無しさん
2016/06/01(水) 11:50:03.90ID:6wx+Ihuz $text = 'hoge<span class="hoge" id="hoge">"hoge"</span><span class="huge" id="huge">"hoge"</span>huge';
上のような文字列で<〜>(タグ内)に囲まれた"だけ
上のような文字列で<〜>(タグ内)に囲まれた"だけ
162デフォルトの名無しさん
2016/06/01(水) 11:54:16.91ID:6wx+Ihuz $text = 'hoge<span class="hoge" id="hoge">"hoge"</span>
<span class="huge" id="huge">"hoge"</span>huge';
上のような文字列(改行されてますが1行です)で<〜>(タグ内)に囲まれた"だけ " に置換したいです
s/(<.*?)"(.*?>)/$1"$2/g;
上のように試してみましたが、最初の1つのみ " に置換されるだけです
よろしくお願いします
<span class="huge" id="huge">"hoge"</span>huge';
上のような文字列(改行されてますが1行です)で<〜>(タグ内)に囲まれた"だけ " に置換したいです
s/(<.*?)"(.*?>)/$1"$2/g;
上のように試してみましたが、最初の1つのみ " に置換されるだけです
よろしくお願いします
163162
2016/06/01(水) 12:36:41.40ID:6wx+Ihuz タグの外側だけ置換する方法としては下記がどこかに載っていました
s/((?:\G|>)[^<]*?)"/$1"/g;
タグの内側だけ置換したい場合は>と<を逆にすればいいかと思ったのですができませんでした
s/((?:\G|>)[^<]*?)"/$1"/g;
タグの内側だけ置換したい場合は>と<を逆にすればいいかと思ったのですができませんでした
164デフォルトの名無しさん
2016/06/01(水) 12:56:13.02ID:UybPRljc >>161-163
$text =~ s{(?<=&lt;)(.+?)(?=&gt;)}{ $1 =~ s/&quot;/"/gr }eg;
$text =~ s{(?<=&lt;)(.+?)(?=&gt;)}{ $1 =~ s/&quot;/"/gr }eg;
165デフォルトの名無しさん
2016/06/01(水) 13:07:26.71ID:6wx+Ihuz166デフォルトの名無しさん
2016/06/01(水) 13:32:03.91ID:MHn5bFUb どんなエラーか解らないことにはなんとも……
ひょっとして、5.14 以前の Perl を使ってたりする?
ひょっとして、5.14 以前の Perl を使ってたりする?
167デフォルトの名無しさん
2016/06/01(水) 13:44:06.85ID:6wx+Ihuz >>166
5.8系です
AddHandler cgi-script-debugが使えなくなってデバッグができないんです
この文法チェッカもいつの間にか消えてました
http://homepage2.nifty.com/sophia0/perl.html
5.8系です
AddHandler cgi-script-debugが使えなくなってデバッグができないんです
この文法チェッカもいつの間にか消えてました
http://homepage2.nifty.com/sophia0/perl.html
168デフォルトの名無しさん
2016/06/01(水) 14:04:04.96ID:6wx+Ihuz teraterm入れてSSH登録してエラーチェックしてみました
Bareword found where operator expected at test.cgi line 7, near "s/"/"/gr"
syntax error at test.cgi line 7, near "s/"/"/gr "
test.cgi had compilation errors.
Bareword found where operator expected at test.cgi line 7, near "s/"/"/gr"
syntax error at test.cgi line 7, near "s/"/"/gr "
test.cgi had compilation errors.
169デフォルトの名無しさん
2016/06/01(水) 14:11:20.95ID:MHn5bFUb 置換の r オプションは 5.14 からです。従来通り
perl -pe 's{(?<=&lt;)(.+?)(?=&gt;)}{ ( $str = $1) =~ s!&quot;!\"!g ; $str ; }eg'
みたいな感じでどうでしょうか。
perl -pe 's{(?<=&lt;)(.+?)(?=&gt;)}{ ( $str = $1) =~ s!&quot;!\"!g ; $str ; }eg'
みたいな感じでどうでしょうか。
170デフォルトの名無しさん
2016/06/01(水) 14:17:56.91ID:6wx+Ihuz171デフォルトの名無しさん
2016/06/01(水) 20:08:28.85ID:2S8m0KQ+ 5.14(新しい) > 5.8(古い)だぞ
172デフォルトの名無しさん
2016/06/01(水) 21:17:48.26ID:1kxD8r4Z そいや5.24でpushやpop,shiiftなどにリファレンスを渡したときの
自動デリファレンスが止めになったのはなぜ?
折角5.14で入れた機能なのに。
自動デリファレンスが止めになったのはなぜ?
折角5.14で入れた機能なのに。
173デフォルトの名無しさん
2016/06/01(水) 21:25:33.54ID:BXoQUtbW なぜも何も。
もともと「実験的に採用した」って宣言してるし、
失敗でした、って delta に書いてあるし。
もともと「実験的に採用した」って宣言してるし、
失敗でした、って delta に書いてあるし。
174デフォルトの名無しさん
2016/06/02(木) 14:00:14.87ID:tGqw3Zei perlは、常にunstable ♪
オレの人生もunstable ♫
オレの人生もunstable ♫
175デフォルトの名無しさん
2016/06/02(木) 14:23:32.77ID:TTUXXyQU Windows 7で
tree D: /f > tree_list.txt
これで書き出した物をperlでフルパスに変換したいのですが、
何か良いモジュールなどはありますか?
tree D: /f > tree_list.txt
これで書き出した物をperlでフルパスに変換したいのですが、
何か良いモジュールなどはありますか?
176デフォルトの名無しさん
2016/06/02(木) 16:16:38.49ID:I/c4JKn/ File::Spec がそうかも。
177デフォルトの名無しさん
2016/06/03(金) 02:13:33.36ID:7/QVUMn+ cmd.exe にまかせるがよろし
dir /s /b D: 2>NUL
dir /s /b D: 2>NUL
178デフォルトの名無しさん
2016/06/03(金) 12:58:52.91ID:a9xFHzmZ179デフォルトの名無しさん
2016/06/04(土) 15:10:16.50ID:d7ojMir6 ループの条件を満たしてなくてもredoでループされるんだけど、そうゆうことでいいのかな
180デフォルトの名無しさん
2016/06/04(土) 15:25:38.27ID:wKu/P36l181デフォルトの名無しさん
2016/06/04(土) 16:50:14.92ID:d7ojMir6 >redo コマンドは、条件を再評価しないで、ループブロックの始めからもう一度 実行を開始します
そうかそうか、これが欲しかった。どうも。
そうかそうか、これが欲しかった。どうも。
182デフォルトの名無しさん
2016/06/08(水) 04:54:48.15ID:c/sFGpfw ちょっと相談と言うか、バグの原因が想像つかなくてこまっちんぐなんだけど、
$| = 1;
for(.....){
................
.................
print $x;
}
みたいな感じでいっぱいプリントしてる時、
プロセス実行中は8.00KB(8192B)しか出力されないんだよね。
本来は9.22KB程度出力されるはずで、これはプロセスが終了したら出力される。
$| = 1;
for(.....){
................
.................
print $x;
}
みたいな感じでいっぱいプリントしてる時、
プロセス実行中は8.00KB(8192B)しか出力されないんだよね。
本来は9.22KB程度出力されるはずで、これはプロセスが終了したら出力される。
183デフォルトの名無しさん
2016/06/08(水) 05:03:29.17ID:c/sFGpfw ちゃんとcloseを記述したら直りました。
184デフォルトの名無しさん
2016/06/08(水) 05:36:30.43ID:tfudflM8 どうしても即時出力したいなら、バッファリングで検索
185デフォルトの名無しさん
2016/06/08(水) 15:34:08.08ID:1ofjxszc 10GBくらいのCSVで作成された辞書の文字を置換して出力する場合最も適切な方法はどんな感じ?
すぐ思いつくのは下記だけど、膨大な回数HDDにアクセスして大丈夫かと不安になるがバッファリングされるから影響はないかな?
open(IN,"<Wikipedia.txt");
open(OUT,">>test.txt");
while(<IN>){
$_ =~ s/<|>/<>/g;
print OUT $_;
}
close OUT;
close IN;
すぐ思いつくのは下記だけど、膨大な回数HDDにアクセスして大丈夫かと不安になるがバッファリングされるから影響はないかな?
open(IN,"<Wikipedia.txt");
open(OUT,">>test.txt");
while(<IN>){
$_ =~ s/<|>/<>/g;
print OUT $_;
}
close OUT;
close IN;
186デフォルトの名無しさん
2016/06/08(水) 15:38:30.27ID:c/sFGpfw そら最低の理論値でも10GB分HDDから読み出しして10GB分HDDに書き出ししないとな
187デフォルトの名無しさん
2016/06/08(水) 15:56:29.67ID:1ofjxszc >>186
単にリードするだけなら10GBは大丈夫だろうけど、
出力のバッファリングが甘いと、何度も書き込みHDDに凄い負担掛かるんじゃないかと思って・・・
因みに、昔は下記みたいにしてた、やたらHDDがガリガリ言ってた気がする
正しい方法はどうするのが良いのかと思ってね・・・
$| = 1;
open(IN,"<Wikipedia.txt");
while(<IN>){
open(OUT,">>test.txt");
$_ =~ s/<|>/<>/g;
print OUT $_;
close OUT;
print $count++;
print "\n";
}
close IN;
単にリードするだけなら10GBは大丈夫だろうけど、
出力のバッファリングが甘いと、何度も書き込みHDDに凄い負担掛かるんじゃないかと思って・・・
因みに、昔は下記みたいにしてた、やたらHDDがガリガリ言ってた気がする
正しい方法はどうするのが良いのかと思ってね・・・
$| = 1;
open(IN,"<Wikipedia.txt");
while(<IN>){
open(OUT,">>test.txt");
$_ =~ s/<|>/<>/g;
print OUT $_;
close OUT;
print $count++;
print "\n";
}
close IN;
188デフォルトの名無しさん
2016/06/09(木) 08:19:20.98ID:5xTa9iMx189デフォルトの名無しさん
2016/06/09(木) 08:56:02.57ID:a3MG4bWs190デフォルトの名無しさん
2016/06/12(日) 12:28:41.66ID:JDueIOd3 どんな言語で書いても10GBのHDDをアクセスすること自体に変わりはない。
温度が上昇してエラーになるなら、扇風機で冷やしながら実行するとよい。
温度が上昇してエラーになるなら、扇風機で冷やしながら実行するとよい。
191デフォルトの名無しさん
2016/06/12(日) 13:25:11.80ID:ve4Ih4ce そうかなー
スクリプトだとなにやられてるんだか分からない印象だけど
スクリプトだとなにやられてるんだか分からない印象だけど
192デフォルトの名無しさん
2016/06/12(日) 13:26:20.33ID:0HO5/jac そもそも10GBのテキストなんざ、
今の基準で言えば普通よりちょっとデカい程度。
日常的に扱かってる人間からすれば、質問自体が意味不明。
一回こっきりの捨てスクリプトなんだろうから、
検証以前にさっさと書いて終りにすりゃあいい。
今の基準で言えば普通よりちょっとデカい程度。
日常的に扱かってる人間からすれば、質問自体が意味不明。
一回こっきりの捨てスクリプトなんだろうから、
検証以前にさっさと書いて終りにすりゃあいい。
193デフォルトの名無しさん
2016/06/12(日) 14:32:37.22ID:wrakKGfW でも>>187は毎回やってると流石にHDD痛めそうな気がする
ベストな方法や、やってはならない方法はあるでしょ
ベストな方法や、やってはならない方法はあるでしょ
194デフォルトの名無しさん
2016/06/12(日) 15:01:08.44ID:0HO5/jac195デフォルトの名無しさん
2016/06/12(日) 16:03:16.27ID:ve4Ih4ce まぁ俺は10GB程度のファイル、頻繁にDLしたり削除したりコピーしたり色々してるけどな、ほぼ毎日。
196デフォルトの名無しさん
2016/06/12(日) 18:22:13.25ID:wrakKGfW プログラムもだけど$|=1;使って動作確認してたり、
バッファリング無し、バッチ処理で毎晩10GB1行毎の書き込みは流石にまずいんじゃない?
185も$|=1;使ったらどんな動作になるんだろ?
187はコードが見やすくなるからテストでは結構使ってる
そのまま忘れてて大きなファイルを解析させてたりもある
みんな185形式で書いてるの?
バッファリング無し、バッチ処理で毎晩10GB1行毎の書き込みは流石にまずいんじゃない?
185も$|=1;使ったらどんな動作になるんだろ?
187はコードが見やすくなるからテストでは結構使ってる
そのまま忘れてて大きなファイルを解析させてたりもある
みんな185形式で書いてるの?
197デフォルトの名無しさん
2016/06/12(日) 18:23:39.84ID:wrakKGfW 速度も考えて最近は配列に貯めてからすることがある
ただWindowsだとすぐout of memoryでる
ただWindowsだとすぐout of memoryでる
198デフォルトの名無しさん
2016/06/12(日) 18:58:39.76ID:ve4Ih4ce まあ自分のPCならサブマシンでもメモリ32Gあるし別に・・・って感じだが
199デフォルトの名無しさん
2016/06/12(日) 19:00:15.13ID:ve4Ih4ce でもPerlってメモリの量が異常に増えるんだよね
10MBのデータを読み込んでごにょごにょしてたらなぜかメモリ200MBになってたり
普通にネイティブな言語使ったほうがいいのでは
10MBのデータを読み込んでごにょごにょしてたらなぜかメモリ200MBになってたり
普通にネイティブな言語使ったほうがいいのでは
200デフォルトの名無しさん
2016/06/12(日) 21:45:18.08ID:0HO5/jac どんなレス考えても、罵倒しか思い浮ばん。
HDDの負担以前の問題だよ。
open/closeを行数分繰替えすのが、
どれだけ時間の無駄(=マシンに負荷がかかる)か実例貼っとく。
$ perl -le ' sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;'
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 36471 13.2 0.1 2445400 3344 s002 S+ 8:24PM 0:00.16 perl -le sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 36471 22.5 0.0 2445400 1664 s002 S+ 8:24PM 24:21.88 perl -le sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;
CPU time で24分だけど、実際には、9時半まで処理掛かってる。
HDDの負担以前の問題だよ。
open/closeを行数分繰替えすのが、
どれだけ時間の無駄(=マシンに負荷がかかる)か実例貼っとく。
$ perl -le ' sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;'
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 36471 13.2 0.1 2445400 3344 s002 S+ 8:24PM 0:00.16 perl -le sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 36471 22.5 0.0 2445400 1664 s002 S+ 8:24PM 24:21.88 perl -le sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;
CPU time で24分だけど、実際には、9時半まで処理掛かってる。
201デフォルトの名無しさん
2016/06/12(日) 21:49:23.64ID:0HO5/jac $ perl -le ' sub ps { print `ps ux $$`}; ps ; open my $h, ">", "test.txt" ; for( 0 .. 9999999 ){ print {$h} "h" } ; ps ;'
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 40081 7.0 0.1 2445400 3324 s002 R+ 9:36PM 0:00.09 perl -le sub ps { print `ps ux $$`}; ps ; open my $h, ">", "test.txt" ; for( 0 .. 9999999 ){ print {$h} "h" } ; ps ;
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 40081 96.8 0.1 2445400 3340 s002 S+ 9:36PM 0:03.08 perl -le sub ps { print `ps ux $$`}; ps ; open my $h, ">", "test.txt" ; for( 0 .. 9999999 ){ print {$h} "h" } ; ps ;
$ ls -alh test.txt
-rw-r--r-- 1 XXXXX staff 19M 6 12 21:36 test.txt
今の時代の強力なマシンだろうが、こんだけ負担をかける事は、一昔前の人間だったら常識の範囲。
ちなみにフラッシュしようが、出力される量は変動しないんだから、
HDDの負担は変らん。と何回指摘されりゃ気が済むんだ?
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 40081 7.0 0.1 2445400 3324 s002 R+ 9:36PM 0:00.09 perl -le sub ps { print `ps ux $$`}; ps ; open my $h, ">", "test.txt" ; for( 0 .. 9999999 ){ print {$h} "h" } ; ps ;
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 40081 96.8 0.1 2445400 3340 s002 S+ 9:36PM 0:03.08 perl -le sub ps { print `ps ux $$`}; ps ; open my $h, ">", "test.txt" ; for( 0 .. 9999999 ){ print {$h} "h" } ; ps ;
$ ls -alh test.txt
-rw-r--r-- 1 XXXXX staff 19M 6 12 21:36 test.txt
今の時代の強力なマシンだろうが、こんだけ負担をかける事は、一昔前の人間だったら常識の範囲。
ちなみにフラッシュしようが、出力される量は変動しないんだから、
HDDの負担は変らん。と何回指摘されりゃ気が済むんだ?
202デフォルトの名無しさん
2016/06/12(日) 21:54:39.02ID:0HO5/jac203デフォルトの名無しさん
2016/06/12(日) 23:18:14.97ID:wrakKGfW204デフォルトの名無しさん
2016/06/12(日) 23:41:21.09ID:0HO5/jac205デフォルトの名無しさん
2016/06/12(日) 23:49:21.59ID:xguVhByI >>201
> ちなみにフラッシュしようが、出力される量は変動しないんだから、
> HDDの負担は変らん。と何回指摘されりゃ気が済むんだ?
出力される量は変動しなくても
書き込み回数は増えるじゃん。
フラッシュって何をやってるのか知らないの?
HDDに書き込まないでメモリに蓄えているものを
書き出す処理だぞ。
だからHDDの負担は増える。
> ちなみにフラッシュしようが、出力される量は変動しないんだから、
> HDDの負担は変らん。と何回指摘されりゃ気が済むんだ?
出力される量は変動しなくても
書き込み回数は増えるじゃん。
フラッシュって何をやってるのか知らないの?
HDDに書き込まないでメモリに蓄えているものを
書き出す処理だぞ。
だからHDDの負担は増える。
206デフォルトの名無しさん
2016/06/12(日) 23:52:30.66ID:xguVhByI ちなみに、出力される量も実際に変動する。
HDDに限らないが通常書き込みっていうのは
ブロック単位で書き込まれる。
HDDの場合は512バイトだったり最近は4Kバイトだったりする。
1バイトの書き込みでも4Kバイト書き込まれるわけだ。
だからデータ量が1000バイトだった場合、
フラッシュ無しだと4KBの書き込みだが
1バイト毎にフラッシュすると、4KB×1000=4MBの書き込み量になる。
ファイルサイズはどちらも同じ1000バイトであっても
それを作るための書き込み量は違う。
HDDに限らないが通常書き込みっていうのは
ブロック単位で書き込まれる。
HDDの場合は512バイトだったり最近は4Kバイトだったりする。
1バイトの書き込みでも4Kバイト書き込まれるわけだ。
だからデータ量が1000バイトだった場合、
フラッシュ無しだと4KBの書き込みだが
1バイト毎にフラッシュすると、4KB×1000=4MBの書き込み量になる。
ファイルサイズはどちらも同じ1000バイトであっても
それを作るための書き込み量は違う。
207デフォルトの名無しさん
2016/06/13(月) 00:08:38.69ID:GclKUW1b >ちなみにフラッシュしようが、出力される量は変動しないんだから、
>HDDの負担は変らん。と何回指摘されりゃ気が済むんだ?
この二行は、あなたのご指摘通り。
訂正します。
>>187の
>$| = 1;
は、*OUTのフラッシュになんの関与もしていないけど。
>HDDの負担は変らん。と何回指摘されりゃ気が済むんだ?
この二行は、あなたのご指摘通り。
訂正します。
>>187の
>$| = 1;
は、*OUTのフラッシュになんの関与もしていないけど。
208デフォルトの名無しさん
2016/06/13(月) 00:32:22.24ID:Yqh2uzvZ >>204
205-206が言いたいこと言ってくれた
擁護でも晒すわけでもなく、より適切な方法が見つかれば良いと思う
185にしても、もっとバッファリングしてやればHDDへのIOが減りHDDの負担は減るんじゃないかなと
標準だと4/8KBでフラッシュしてるよね、これを100MBにすればHDDへの負担はぐっと減りそう
今時のキャッシュ大きめのHDDでどの程度意味があるのか分からないし
寿命に影響するかどうかは分からないけど毎日繰り返す処理なら意味があるかも
>>207
そうなの?って思って調べてみた
http://mikeda.hatenablog.com/entry/20090503/1241365884
みたらselectしないと効かないっぽいな
205-206が言いたいこと言ってくれた
擁護でも晒すわけでもなく、より適切な方法が見つかれば良いと思う
185にしても、もっとバッファリングしてやればHDDへのIOが減りHDDの負担は減るんじゃないかなと
標準だと4/8KBでフラッシュしてるよね、これを100MBにすればHDDへの負担はぐっと減りそう
今時のキャッシュ大きめのHDDでどの程度意味があるのか分からないし
寿命に影響するかどうかは分からないけど毎日繰り返す処理なら意味があるかも
>>207
そうなの?って思って調べてみた
http://mikeda.hatenablog.com/entry/20090503/1241365884
みたらselectしないと効かないっぽいな
209デフォルトの名無しさん
2016/06/13(月) 01:15:56.79ID:w1lAZiF2 夏場なんで、while ブロックの先頭に
sleep 2 unless $. % 10000;
を入れるとよい。2つの数字は調整してみてくれ。
sleep 2 unless $. % 10000;
を入れるとよい。2つの数字は調整してみてくれ。
210デフォルトの名無しさん
2016/06/13(月) 15:19:04.03ID:bjrR9GHC #!/usr/bin/perl -w
use strict;
use File::Path;
use IO::File;
sub diskstat {
system(
use strict;
use File::Path;
use IO::File;
sub diskstat {
system(
211デフォルトの名無しさん
2016/06/13(月) 16:48:17.11ID:bjrR9GHC https://ideone.com/fUNKyh
このプログラムの意図 : >>185 と >>187 の違いがディスクアクセスに及ぼす影響の検証。
明らかに >>185 よりも >>187 の方がシステムコールの回数が多い。
しかし、それだけでディスクアクセスに違いが出てくるわけではない。
実行時間を同程度にしてみたらどうなるだろうか。
実行する前に
grep sda5
の sda5 を環境に合わせて書き換えてほしい。
このプログラムの意図 : >>185 と >>187 の違いがディスクアクセスに及ぼす影響の検証。
明らかに >>185 よりも >>187 の方がシステムコールの回数が多い。
しかし、それだけでディスクアクセスに違いが出てくるわけではない。
実行時間を同程度にしてみたらどうなるだろうか。
実行する前に
grep sda5
の sda5 を環境に合わせて書き換えてほしい。
212デフォルトの名無しさん
2016/06/14(火) 01:15:43.18ID:M6DJWkXG > 実行時間を同程度にしてみたらどうなるだろうか。
実行時間を同程度にしたら、遅い方の書き込み量が減るから
比較にならんだろw
実行時間を同程度にしたら、遅い方の書き込み量が減るから
比較にならんだろw
213デフォルトの名無しさん
2016/06/14(火) 20:04:47.85ID:UhtJW9b9 プログラムを見てくれてないのかな……だとしたらその時点でもう対象外なんだけど。
ろくに見もしないで何を想像したの?
ろくに見もしないで何を想像したの?
214デフォルトの名無しさん
2016/06/15(水) 01:35:53.40ID:7O5/ia9k そう言えば古いDiffソフト(AikoWin)やたらHDDガリガリ音鳴ってたな
あれ読み出しが少しずつでHDDに相当の負担が掛かるとか聞いたことがある
細かいファイルを書き込むのも良くないけど、自分でソフト作る時にには
呼び出しも気を付けないとまずいんだよなー
あれ読み出しが少しずつでHDDに相当の負担が掛かるとか聞いたことがある
細かいファイルを書き込むのも良くないけど、自分でソフト作る時にには
呼び出しも気を付けないとまずいんだよなー
215211
2016/06/15(水) 12:03:11.68ID:rzJhZO2i もう少しマシなプログラムを書いてみたよ。
https://ideone.com/Nh4Esi
Linux 限定だけど無修正で実行できる。
実行時間は 5 分くらいかかるよ。正確なデータを得るにはそうした方がいいみたいなんだ……
https://ideone.com/Nh4Esi
Linux 限定だけど無修正で実行できる。
実行時間は 5 分くらいかかるよ。正確なデータを得るにはそうした方がいいみたいなんだ……
216デフォルトの名無しさん
2016/06/15(水) 13:23:28.38ID:rzJhZO2i 自分の実行結果を書いておくよ。
sub f_a {
my $fh = IO::File->new( &genfn(),'>') || die( $!);
$fh->autoflush( 0);
$fh->print('h') foreach 0 .. 65535;
$fh->close;
}
sub f_b {
my $fh = IO::File->new( &genfn(),'>') || die( $!);
$fh->autoflush( 1);
$fh->print('h') foreach 0 .. 65535;
$fh->close;
}
sub f_c {
my $fn = &genfn();
foreach ( 0 .. 65535) {
my $fh = IO::File->new( $fn,'>>') || die( $!);
$fh->print('h');
$fh->close;
}
}
これらを 16 回ずつ実行した結果、f_a,f_b はそれぞれ 2232 セクタ、
f_c は 2224 セクタ書き込んだみたいだよ。もちろん書き込んだ回数だよ。
sub f_a {
my $fh = IO::File->new( &genfn(),'>') || die( $!);
$fh->autoflush( 0);
$fh->print('h') foreach 0 .. 65535;
$fh->close;
}
sub f_b {
my $fh = IO::File->new( &genfn(),'>') || die( $!);
$fh->autoflush( 1);
$fh->print('h') foreach 0 .. 65535;
$fh->close;
}
sub f_c {
my $fn = &genfn();
foreach ( 0 .. 65535) {
my $fh = IO::File->new( $fn,'>>') || die( $!);
$fh->print('h');
$fh->close;
}
}
これらを 16 回ずつ実行した結果、f_a,f_b はそれぞれ 2232 セクタ、
f_c は 2224 セクタ書き込んだみたいだよ。もちろん書き込んだ回数だよ。
217デフォルトの名無しさん
2016/06/15(水) 17:57:12.29ID:rzJhZO2i https://ideone.com/K0qeSx
もう少しユーザーフレンドリーな感じにしてみたよ。これで最後だよ。
Windows ではこういう情報を得る方法は無いの?
非同期書き込みが無いのなら彼らの言うことも間違いではないんだけど。
もう少しユーザーフレンドリーな感じにしてみたよ。これで最後だよ。
Windows ではこういう情報を得る方法は無いの?
非同期書き込みが無いのなら彼らの言うことも間違いではないんだけど。
218デフォルトの名無しさん
2016/06/18(土) 11:42:41.43ID:zTifxauk $ perl -p -e 〜
となっているのですが、-p と -e の意味を教えてください。
となっているのですが、-p と -e の意味を教えてください。
219218
2016/06/18(土) 13:00:49.64ID:zTifxauk 一行構文のOPだとわかりました。
しかし、
C:\perl\bin\perl -e 'for $i (@ARGV) { print $i ,"\n";}' args1 args2 args3
をWindows環境で実行すると
Can't find string terminator "'" anywhere before EOF at -e line 1
と出てしまいます。
解決方法を教えほしいです。
しかし、
C:\perl\bin\perl -e 'for $i (@ARGV) { print $i ,"\n";}' args1 args2 args3
をWindows環境で実行すると
Can't find string terminator "'" anywhere before EOF at -e line 1
と出てしまいます。
解決方法を教えほしいです。
220デフォルトの名無しさん
2016/06/18(土) 13:07:12.42ID:FKPQs3z7 'print "\n"'ではなく"print qq(\n)"のように
221デフォルトの名無しさん
2016/06/18(土) 14:22:55.12ID:zTifxauk C:\perl\bin\perl -e 'for $i (@ARGV) { "print $i ,qq(\n)";}' args1 args2 args3
で試したがダメでした…
で試したがダメでした…
222デフォルトの名無しさん
2016/06/18(土) 14:58:07.42ID:h9LNivvl >>221
俺は昨日から始めたんで確かなことは言えないけど、
DOSプロンプトだと、''で括ってもダメだったよ
(何か設定があるんだけど昨日からなんで...)
例えば、
perl -e 'print "hello"'
は
perl -e "print \"Hello World\n\""
ってしないと動かなかった
俺は昨日から始めたんで確かなことは言えないけど、
DOSプロンプトだと、''で括ってもダメだったよ
(何か設定があるんだけど昨日からなんで...)
例えば、
perl -e 'print "hello"'
は
perl -e "print \"Hello World\n\""
ってしないと動かなかった
223デフォルトの名無しさん
2016/06/18(土) 15:22:54.54ID:h9LNivvl よくよく考えたら、コマンドプロンプトで''はいけるはず無いよね
だって、まずコマンドプロンプトで命令が解釈されるわけだから
'a b'だと、連続した文字列とはならずに
'aとb'の2つの引数が指定されたと受け取られちゃうわけだしね
だって、まずコマンドプロンプトで命令が解釈されるわけだから
'a b'だと、連続した文字列とはならずに
'aとb'の2つの引数が指定されたと受け取られちゃうわけだしね
224デフォルトの名無しさん
2016/06/18(土) 15:30:14.88ID:xZeqh3Cr Perl の文法上
"\n"
の代わりに
qq(\n)
と書けますよ……という話じゃないのかなあ。
とりあえず、ググって見つけたページ
http://thinca.hatenablog.com/entry/20100210/1265813598
http://up-cat.net/%25A5%25B3%25A5%25DE%25A5%25F3%25A5%25C9%25A5%25D7%25A5%25ED%25A5%25F3%25A5%25D7%25A5%25C8%25A4%25CE%25A5%25A8%25A5%25B9%25A5%25B1%25A1%25BC%25A5%25D7%25BB%25C5%25CD%25CD.html
相変わらずカオスなんですね。それがいやで Linux に乗り換えたのは前世紀のことなのに……
"\n"
の代わりに
qq(\n)
と書けますよ……という話じゃないのかなあ。
とりあえず、ググって見つけたページ
http://thinca.hatenablog.com/entry/20100210/1265813598
http://up-cat.net/%25A5%25B3%25A5%25DE%25A5%25F3%25A5%25C9%25A5%25D7%25A5%25ED%25A5%25F3%25A5%25D7%25A5%25C8%25A4%25CE%25A5%25A8%25A5%25B9%25A5%25B1%25A1%25BC%25A5%25D7%25BB%25C5%25CD%25CD.html
相変わらずカオスなんですね。それがいやで Linux に乗り換えたのは前世紀のことなのに……
225デフォルトの名無しさん
2016/06/18(土) 17:13:02.52ID:Q2VQ6qXf DOS/Windowsコマンドプロンプトのクォートは "
UNIXのシェルのクォートは '
ただそれだけ
コマンドプロンプトのクォートとして "" を使っているから、Perl部分は
qq() を使ってる
UNIXのシェルのクォートは '
ただそれだけ
コマンドプロンプトのクォートとして "" を使っているから、Perl部分は
qq() を使ってる
226デフォルトの名無しさん
2016/06/18(土) 17:51:48.00ID:5RdW1n8d すごいにゃー。ワシは動けばいいやなんで。
227デフォルトの名無しさん
2016/06/18(土) 17:53:59.52ID:qpxG5nAO 動かないんだろ?
228デフォルトの名無しさん
2016/06/18(土) 20:50:09.79ID:QKdVDmdU PowerShell_ISE では、どうなる?
229デフォルトの名無しさん
2016/06/19(日) 20:43:06.86ID:p98kttl2 ファイルの中身じゃなくて、ファイル名をバイナリかなんかで扱いたいときはどうすれば良いでしょうか
どっかの国のどっか語でファイル名書いてあって、ファイル一覧を入手したら全部文字化けみたいな感じになってて困った
どっかの国のどっか語でファイル名書いてあって、ファイル一覧を入手したら全部文字化けみたいな感じになってて困った
230デフォルトの名無しさん
2016/06/19(日) 22:30:28.43ID:/GELYJ8A まず、そのファイルが壊れてないかどうかエンコーディングが判らないことには確認しようがありません。
そして、そこに書かれているファイル名が正しいとしても、問題はそのファイル名で何をするかです。
ファイルを作成するとしたら少々困難を伴うと思いますが、何をしますか?
もう少し説明が欲しいです。
そして、そこに書かれているファイル名が正しいとしても、問題はそのファイル名で何をするかです。
ファイルを作成するとしたら少々困難を伴うと思いますが、何をしますか?
もう少し説明が欲しいです。
231デフォルトの名無しさん
2016/06/19(日) 23:56:05.73ID:p98kttl2 1: ファイルは壊れてないです。あとファイルの中身はどうでも良くて困ってるのはファイルですね。
2: こちら側からバイナリを含めて希望してるのでそもそも文字コードは問わないです。
なおwindowsですので強制的な解釈としてはcp932でしょうか。文字かどうかは不明ですか。
3: 書いてある通り、ファイル一覧を入手したいです。(と言うよりすでにしました)。その時点での文字化けについてです。
2: こちら側からバイナリを含めて希望してるのでそもそも文字コードは問わないです。
なおwindowsですので強制的な解釈としてはcp932でしょうか。文字かどうかは不明ですか。
3: 書いてある通り、ファイル一覧を入手したいです。(と言うよりすでにしました)。その時点での文字化けについてです。
232デフォルトの名無しさん
2016/06/20(月) 01:41:13.70ID:Nxz2d29B 文字化けは君の環境のフォントの問題では…
233デフォルトの名無しさん
2016/06/20(月) 01:52:28.59ID:3dbzY2ue234デフォルトの名無しさん
2016/06/20(月) 01:55:16.19ID:3dbzY2ue >>231
CPANにあるWin32::Unicodeを使ってみてはどうだろう。
CPANにあるWin32::Unicodeを使ってみてはどうだろう。
235デフォルトの名無しさん
2016/06/20(月) 02:14:22.79ID:JJJI2UNm ちゃんと話を追ってればシングルクォートではコマンド文字列をperlに渡せないってことを理解できるのに
だから>>220では全体をダブルクォートで括ってるわけ
だから>>220では全体をダブルクォートで括ってるわけ
236230
2016/06/20(月) 13:40:47.81ID:cF0IFcLP >>231
「そのファイルが壊れてないか」と書いたのはファイル一覧のことだったんですが……
まあ、それは置いといて。
困っていると言われても、何をお望みなのかよく分かりません。
マルチバイト文字を作成者が意図した通りの文字として読みたいということなら、
やはりエンコーディングを知る必要があります。
そして、そのエンコーディングを扱うことが出来るソフトウェアと、もちろんフォントも必要です。
どんな環境で、どこからどのような手段で入手して、何をして文字化けだと思ったのか、
それがどうなるのが望みなのかを書いていただけないと、お役に立てそうもありません。
「そのファイルが壊れてないか」と書いたのはファイル一覧のことだったんですが……
まあ、それは置いといて。
困っていると言われても、何をお望みなのかよく分かりません。
マルチバイト文字を作成者が意図した通りの文字として読みたいということなら、
やはりエンコーディングを知る必要があります。
そして、そのエンコーディングを扱うことが出来るソフトウェアと、もちろんフォントも必要です。
どんな環境で、どこからどのような手段で入手して、何をして文字化けだと思ったのか、
それがどうなるのが望みなのかを書いていただけないと、お役に立てそうもありません。
237デフォルトの名無しさん
2016/06/20(月) 14:10:59.68ID:ppvG3ddJ ファイル名はテキストだろ。
バイナリのファイル名など、聞いたことがない
フォントが無いだけで、たぶん正常だろ。
それか、ファイル一覧を表示している、端末の文字コードが違うだけ
そのファイル名をエディタにコピーして、色々な文字コードに変えて、試してみる
バイナリのファイル名など、聞いたことがない
フォントが無いだけで、たぶん正常だろ。
それか、ファイル一覧を表示している、端末の文字コードが違うだけ
そのファイル名をエディタにコピーして、色々な文字コードに変えて、試してみる
238デフォルトの名無しさん
2016/06/20(月) 14:43:14.96ID:og12Zqf+ 先日も申しましたが、ファイル名はOSの仕様によってcp932扱いで表示されたバイナリです。
windowsにおけるバイナリとテキストの違いは、改行など一部の文字の解釈です
すなわち、ファイル名を入手した時点で破損しています
windowsにおけるバイナリとテキストの違いは、改行など一部の文字の解釈です
すなわち、ファイル名を入手した時点で破損しています
239デフォルトの名無しさん
2016/06/20(月) 15:21:44.17ID:7O0ObdXP うーん・・・
関係ないけど
ハートマークのファイル名作ったけど、
ちゃんと表示できたよ
関係ないけど
ハートマークのファイル名作ったけど、
ちゃんと表示できたよ
240デフォルトの名無しさん
2016/06/20(月) 15:27:52.95ID:JJJI2UNm >>238
「ファイルはテキストだが何のコードでエンコードされたものかわからん」をcp932で開いた
ではなくて
「cp932でエンコードしてしまって、もう元のファイルの情報は欠けてしまった文字化けファイル」を開いた
ってことか?
「ファイルはテキストだが何のコードでエンコードされたものかわからん」をcp932で開いた
ではなくて
「cp932でエンコードしてしまって、もう元のファイルの情報は欠けてしまった文字化けファイル」を開いた
ってことか?
241デフォルトの名無しさん
2016/06/20(月) 16:05:49.21ID:S2CnEqh7 >>238
破損とは何か。期待値と実際値を言わないとわからん
破損とは何か。期待値と実際値を言わないとわからん
242デフォルトの名無しさん
2016/06/20(月) 16:53:54.14ID:cF0IFcLP もう一度聞くけど、どこからどのような手段で入手して、どうやって見てるの?
どうなってほしいの? 使ったソフトウェアの仕様はちゃんと理解できてるの?
どうなってほしいの? 使ったソフトウェアの仕様はちゃんと理解できてるの?
243デフォルトの名無しさん
2016/06/20(月) 23:26:05.47ID:og12Zqf+ Aディレクトリの中のファイル名をopendirでとってくる。
この時のファイル名ってどう言う扱い?バイナリ?テキスト?コードは?フラグは?
とってきたらそれがすでに破損してて開くこともできない。
この時のファイル名ってどう言う扱い?バイナリ?テキスト?コードは?フラグは?
とってきたらそれがすでに破損してて開くこともできない。
244デフォルトの名無しさん
2016/06/20(月) 23:27:22.44ID:og12Zqf+ もちろん cp932で定義されてる範囲のバイト列ではバグらないよ
245デフォルトの名無しさん
2016/06/21(火) 00:30:40.48ID:zxMwhnoQ そうですか。
で?
で?
246デフォルトの名無しさん
2016/06/21(火) 12:21:49.21ID:yHwsrvxs -------------------------------------------------------
Perl に関係ない話題は、以上で終了。
Perl に関係ない話題は、以上で終了。
247デフォルトの名無しさん
2016/06/22(水) 02:03:09.88ID:pkNIGL7K >>ファイルの中身じゃなくて、ファイル名をバイナリかなんかで扱いたいときはどうすれば良いでしょうか
特別なことをしなければバイナリで扱うことになる。むしろファイル名は文字列では扱(え|わ)ない。
特別なことをしなければバイナリで扱うことになる。むしろファイル名は文字列では扱(え|わ)ない。
248デフォルトの名無しさん
2016/06/22(水) 17:07:36.10ID:NJ9t5GVO Perlを使って下記のように2文字半角スペースを入れたいのです。
0015000008006a3376 -> 00 15 00 00 08 00 6a 33 76
下記を教えて貰いましたが旨く出来ません・・・アドバイス願います。
$ perl -p -e 's/(..)/$1 /g;'
001500 -> 00 15 00
0015000008006a3376 -> 00 15 00 00 08 00 6a 33 76
下記を教えて貰いましたが旨く出来ません・・・アドバイス願います。
$ perl -p -e 's/(..)/$1 /g;'
001500 -> 00 15 00
249デフォルトの名無しさん
2016/06/22(水) 17:34:24.64ID:MK9gPhs4 いや、ちゃんとその通りになったけど……どううまくいかなかったの?
末尾にスペースが入っちゃいかんとかなら、方法はあるけど。
末尾にスペースが入っちゃいかんとかなら、方法はあるけど。
250デフォルトの名無しさん
2016/06/22(水) 17:34:34.20ID:zY+0G6HH それでできたけど。
251デフォルトの名無しさん
2016/06/22(水) 17:44:10.61ID:NJ9t5GVO 試したのは下記ですが、進まないと言うか終らないんです。
連続数字は変えますが・・・123456に変更
perl -p -e 's/ 123456/$1 /g;'
perl -p -e 's/(123456)/$1 /g;'
perl -p -e 's/( 123456)/$1 /g;'
perl -p -e 's/\(123456\)/$1 /g;'
連続数字は変えますが・・・123456に変更
perl -p -e 's/ 123456/$1 /g;'
perl -p -e 's/(123456)/$1 /g;'
perl -p -e 's/( 123456)/$1 /g;'
perl -p -e 's/\(123456\)/$1 /g;'
■ このスレッドは過去ログ倉庫に格納されています
