1 名前:デフォルトの名無しさん [2014/02/19(水) 23:36:23.29 .net] CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 (WEBプログラミング板: 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箱目 toro.2ch.net/test/read.cgi/tech/1381561905/ Perlについての質問箱 62箱目 toro.2ch.net/test/read.cgi/tech/1385039352/
152 名前:デフォルトの名無しさん mailto:sage [2016/05/01(日) 16:22:48.05 ID:EJZ0zho6.net] そのコードそのまま(円マークをバックスラッシュにして) 動かしたから、何らかの置換↓が得られたけど? <ul> <li>あ</li> <li>あ</li> <li>あ</li> <li>あ</li> <li class="a">あ</li> </ul> <ul> <li>い</li> <li>い</li> <li>い</li> <li>い</li> <li class="a">い</li> </ul> 無意味なエスケープは、コードの邪魔になるだけだからしない方がいいよ。 置換 s/// の右辺は正規表現ですらない(よってエスケープの必要無い)し。
153 名前:デフォルトの名無しさん mailto:sage [2016/05/03(火) 07:34:49.17 ID:PeIabFbi.net] \現\実 !−=≡ヘ(* - -)ノ
154 名前:デフォルトの名無しさん mailto:sage [2016/05/03(火) 22:19:44.35 ID:u2mE3+tw.net] /[0-9]{$num}/ のような量子数は変数にできないんでしょうか?(^^?
155 名前:デフォルトの名無しさん mailto:sage [2016/05/04(水) 01:44:17.76 ID:eTkSZ25N.net] # 実行してみて 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"; }
156 名前:デフォルトの名無しさん mailto:sage [2016/05/04(水) 17:17:13.34 ID:cuRcUS6e.net] >>152 ありがとうございます。 変数は使えたんですね! 演算子が使えないようでした…申し訳ありません。 /[0-9]{$num+1}/ のような使い方がだめでした orz
157 名前:デフォルトの名無しさん [2016/05/04(水) 22:28:29.07 ID:0wPtL/Lt.net] $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 はデバッグしにくい。
158 名前:デフォルトの名無しさん mailto:sage [2016/05/05(木) 15:20:47.88 ID:W74rdbK+v] >>153 直接埋め込むにはperldoc.jp/docs/perl/5.20.1/perlref.pod#Using32References > 同様に、スカラへのリファレンスを返す式は ${...} で デリファレンスできます。 > 従って、上述の式は以下のように書けます: > > print "That yields ${\($n + 5)} widgets\n"; しかし、お勧めしない。 新しい変数を作るべき。
159 名前:デフォルトの名無しさん mailto:sage [2016/05/05(木) 15:23:19.51 ID:zs5en64n.net] # こうですよ 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"; }
160 名前:153 mailto:sage [2016/05/05(木) 19:10:09.77 ID:eJss6EWw.net] >>156 すごーい\(^^)/ ありがとうございます! >>154 ありがとうございます!
161 名前:153 mailto:sage [2016/05/05(木) 19:13:26.95 ID:eJss6EWw.net] あのあのもう一つ ファイルハンドルで3行読み込むのを作ってみたのですがうまくいきませんでした… どうしたらよいのでしょうか… while ( $line[0..2] = <DATA> ) { print $line[0]; print $line[1]; print $line[2]; } __DATA__ なんたら かんたら たらのめ
162 名前:153 mailto:sage [2016/05/05(木) 19:19:01.51 ID:eJss6EWw.net] ちょっとサンプル省略しすぎてすみません。 ":encoding(cp932)" 等で漢字の表示は問題ありませんm(__)m while ( $line[0] = <DATA> ) { $line[1] = <DATA>; $line[2] = <DATA>; .... のように分解して書くと問題ありません。(DATAは必ず3行一組になります) 一度に、3行読み込む方法があればお教えくださいm(__)m
163 名前:デフォルトの名無しさん mailto:sage [2016/05/05(木) 21:40:51.68 ID:AhXWZZ47.net] @line[0..2] 配列スライスのシジルは@
164 名前:デフォルトの名無しさん mailto:sage [2016/05/05(木) 23:21:34.59 ID:zs5en64n.net] 都合よく固定長を前提にはできないだろうから、 # 全部読んじゃって chomp(@_ = <DATA>); # 3つづつ処理する while (@line = splice(@_,0,3)) { print map {"[$_]"} @line; print "\n"; } __END__ 1 2 3 4 5 6 7 8 9
165 名前:デフォルトの名無しさん [2016/06/01(水) 11:50:03.90 ID:6wx+Ihuz.net] $text = 'hoge<span class="hoge" id="hoge">"hoge"</span><span class="huge" id="huge">"hoge"</span>huge'; 上のような文字列で<〜>(タグ内)に囲まれた"だけ
166 名前:デフォルトの名無しさん [2016/06/01(水) 11:54:16.91 ID:6wx+Ihuz.net] $text = 'hoge<span class="hoge" id="hoge">"hoge"</span> <span class="huge" id="huge">"hoge"</span>huge'; 上のような文字列(改行されてますが1行です)で<〜>(タグ内)に囲まれた"だけ " に置換したいです s/(<.*?)"(.*?>)/$1"$2/g; 上のように試してみましたが、最初の1つのみ " に置換されるだけです よろしくお願いします
167 名前:162 [2016/06/01(水) 12:36:41.40 ID:6wx+Ihuz.net] タグの外側だけ置換する方法としては下記がどこかに載っていました s/((?:\G|>)[^<]*?)"/$1"/g; タグの内側だけ置換したい場合は>と<を逆にすればいいかと思ったのですができませんでした
168 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 12:56:13.02 ID:UybPRljc.net] >>162-164 $text =~ s{(?<=&lt;)(.+?)(?=&gt;)}{ $1 =~ s/&quot;/"/gr }eg;
169 名前:デフォルトの名無しさん [2016/06/01(水) 13:07:26.71 ID:6wx+Ihuz.net] >>165 ありがとうございます やってみましたがエラーになりました もちろん&は半角に直しました
170 名前:デフォルトの名無しさん [2016/06/01(水) 13:32:03.91 ID:MHn5bFUb.net] どんなエラーか解らないことにはなんとも…… ひょっとして、5.14 以前の Perl を使ってたりする?
171 名前:デフォルトの名無しさん [2016/06/01(水) 13:44:06.85 ID:6wx+Ihuz.net] >>167 5.8系です AddHandler cgi-script-debugが使えなくなってデバッグができないんです この文法チェッカもいつの間にか消えてました homepage2.nifty.com/sophia0/perl.html
172 名前:デフォルトの名無しさん [2016/06/01(水) 14:04:04.96 ID:6wx+Ihuz.net] 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.
173 名前:デフォルトの名無しさん [2016/06/01(水) 14:11:20.95 ID:MHn5bFUb.net] 置換の r オプションは 5.14 からです。従来通り perl -pe 's{(?<=&lt;)(.+?)(?=&gt;)}{ ( $str = $1) =~ s!&quot;!\"!g ; $str ; }eg' みたいな感じでどうでしょうか。
174 名前:デフォルトの名無しさん [2016/06/01(水) 14:17:56.91 ID:6wx+Ihuz.net] >>170 できました! 本当にありがとうございました! (Perl 5.8.8なのにエラーが出たのは謎ですね)
175 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 20:08:28.85 ID:2S8m0KQ+.net] 5.14(新しい) > 5.8(古い)だぞ
176 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 21:17:48.26 ID:1kxD8r4Z.net] そいや5.24でpushやpop,shiiftなどにリファレンスを渡したときの 自動デリファレンスが止めになったのはなぜ? 折角5.14で入れた機能なのに。
177 名前:デフォルトの名無しさん mailto:sage [2016/06/01(水) 21:25:33.54 ID:BXoQUtbW.net] なぜも何も。 もともと「実験的に採用した」って宣言してるし、 失敗でした、って delta に書いてあるし。
178 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 14:00:14.87 ID:tGqw3Zei.net] perlは、常にunstable ♪ オレの人生もunstable ♫
179 名前:デフォルトの名無しさん mailto:sage [2016/06/02(木) 14:23:32.77 ID:TTUXXyQU.net] Windows 7で tree D: /f > tree_list.txt これで書き出した物をperlでフルパスに変換したいのですが、 何か良いモジュールなどはありますか?
180 名前:デフォルトの名無しさん [2016/06/02(木) 16:16:38.49 ID:I/c4JKn/.net] File::Spec がそうかも。
181 名前:デフォルトの名無しさん mailto:sage [2016/06/03(金) 02:13:33.36 ID:7/QVUMn+.net] cmd.exe にまかせるがよろし dir /s /b D: 2>NUL
182 名前:デフォルトの名無しさん mailto:sage [2016/06/03(金) 12:58:52.91 ID:a9xFHzmZ.net] >>177 いまいち良い方法が見つからなかった 再帰処理でがりがり頑張ったけど、ものすごい時間が掛かってしまった >>178 ありがとう 無事いけた コマンドライン詳しくないから、NULでひかかった NULの代わりに、list.txtなどにするとサクッと記録された 速度滅茶苦茶早いなー
183 名前:デフォルトの名無しさん mailto:sage [2016/06/04(土) 15:10:16.50 ID:d7ojMir6.net] ループの条件を満たしてなくてもredoでループされるんだけど、そうゆうことでいいのかな
184 名前:デフォルトの名無しさん [2016/06/04(土) 15:25:38.27 ID:wKu/P36l.net] そのための redo だから。 perldoc.jp/index/function
185 名前:デフォルトの名無しさん mailto:sage [2016/06/04(土) 16:50:14.92 ID:d7ojMir6.net] >redo コマンドは、条件を再評価しないで、ループブロックの始めからもう一度 実行を開始します そうかそうか、これが欲しかった。どうも。
186 名前:デフォルトの名無しさん mailto:sage [2016/06/08(水) 04:54:48.15 ID:c/sFGpfw.net] ちょっと相談と言うか、バグの原因が想像つかなくてこまっちんぐなんだけど、 $| = 1; for(.....){ ................ ................. print $x; } みたいな感じでいっぱいプリントしてる時、 プロセス実行中は8.00KB(8192B)しか出力されないんだよね。 本来は9.22KB程度出力されるはずで、これはプロセスが終了したら出力される。
187 名前:デフォルトの名無しさん mailto:sage [2016/06/08(水) 05:03:29.17 ID:c/sFGpfw.net] ちゃんとcloseを記述したら直りました。
188 名前:デフォルトの名無しさん mailto:sage [2016/06/08(水) 05:36:30.43 ID:tfudflM8.net] どうしても即時出力したいなら、バッファリングで検索
189 名前:デフォルトの名無しさん mailto:sage [2016/06/08(水) 15:34:08.08 ID:1ofjxszc.net] 10GBくらいのCSVで作成された辞書の文字を置換して出力する場合最も適切な方法はどんな感じ? すぐ思いつくのは下記だけど、膨大な回数HDDにアクセスして大丈夫かと不安になるがバッファリングされるから影響はないかな? open(IN,"<Wikipedia.txt"); open(OUT,">>test.txt"); while(<IN>){ $_ =~ s/<|>/<>/g; print OUT $_; } close OUT; close IN;
190 名前:デフォルトの名無しさん mailto:sage [2016/06/08(水) 15:38:30.27 ID:c/sFGpfw.net] そら最低の理論値でも10GB分HDDから読み出しして10GB分HDDに書き出ししないとな
191 名前:デフォルトの名無しさん mailto:sage [2016/06/08(水) 15:56:29.67 ID:1ofjxszc.net] >>187 単にリードするだけなら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;
192 名前:デフォルトの名無しさん mailto:sage [2016/06/09(木) 08:19:20.98 ID:5xTa9iMx.net] >>186 環境によるのでもう少し小さいデータと思いついたコードでベンチ取れとしか。 perldoc.jp/docs/perl/perlperf.pod
193 名前:デフォルトの名無しさん mailto:sage [2016/06/09(木) 08:56:02.57 ID:a3MG4bWs.net] >>186 単純な置換、大きなファイルサイズなら、 perl より sed 使ったほうが速いかもな。
194 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 12:28:41.66 ID:JDueIOd3.net] どんな言語で書いても10GBのHDDをアクセスすること自体に変わりはない。 温度が上昇してエラーになるなら、扇風機で冷やしながら実行するとよい。
195 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 13:25:11.80 ID:ve4Ih4ce.net] そうかなー スクリプトだとなにやられてるんだか分からない印象だけど
196 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 13:26:20.33 ID:0HO5/jac.net] そもそも10GBのテキストなんざ、 今の基準で言えば普通よりちょっとデカい程度。 日常的に扱かってる人間からすれば、質問自体が意味不明。 一回こっきりの捨てスクリプトなんだろうから、 検証以前にさっさと書いて終りにすりゃあいい。
197 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 14:32:37.22 ID:wrakKGfW.net] でも>>188 は毎回やってると流石にHDD痛めそうな気がする ベストな方法や、やってはならない方法はあるでしょ
198 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 15:01:08.44 ID:0HO5/jac.net] ちょっと待って>>188 は、論外だろ? これを含めて、ベスト云々を議論すんなら、 「初歩から教えろ」って言ってるのと変らんぞ? 普通に、>>186 でいいじゃん。 >>187 とか、>>191 とか指摘してる通り、 どうあがこうが、10GBの書き込みは生じるんだから。
199 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 16:03:16.27 ID:ve4Ih4ce.net] まぁ俺は10GB程度のファイル、頻繁にDLしたり削除したりコピーしたり色々してるけどな、ほぼ毎日。
200 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 18:22:13.25 ID:wrakKGfW.net] プログラムもだけど$|=1;使って動作確認してたり、 バッファリング無し、バッチ処理で毎晩10GB1行毎の書き込みは流石にまずいんじゃない? 185も$|=1;使ったらどんな動作になるんだろ? 187はコードが見やすくなるからテストでは結構使ってる そのまま忘れてて大きなファイルを解析させてたりもある みんな185形式で書いてるの?
201 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 18:23:39.84 ID:wrakKGfW.net] 速度も考えて最近は配列に貯めてからすることがある ただWindowsだとすぐout of memoryでる
202 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 18:58:39.76 ID:ve4Ih4ce.net] まあ自分のPCならサブマシンでもメモリ32Gあるし別に・・・って感じだが
203 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 19:00:15.13 ID:ve4Ih4ce.net] でもPerlってメモリの量が異常に増えるんだよね 10MBのデータを読み込んでごにょごにょしてたらなぜかメモリ200MBになってたり 普通にネイティブな言語使ったほうがいいのでは
204 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 21:45:18.08 ID:0HO5/jac.net] どんなレス考えても、罵倒しか思い浮ばん。 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時半まで処理掛かってる。
205 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 21:49:23.64 ID:0HO5/jac.net] $ 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の負担は変らん。と何回指摘されりゃ気が済むんだ?
206 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 21:54:39.02 ID:0HO5/jac.net] >>201 ,>>202 は、>>197 へ。
207 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 23:18:14.97 ID:wrakKGfW.net] >>202 今の時代マシーンパワーに物言わせてと言うことが意外と出来きてしまう 勿論、限度はあるけど 朝までに終わればいいわ程度で一度コード作ったらあとは触らないとかね それと、昔デフラグし過ぎるとHDDが壊れるとか言われてた 出力される量でHDDの劣化が決まるって話だけど、細かいファイルを大量に書いたり作成するのはHDDにとって過大な負担になるんじゃない? 例えばだけど、100GBのファイル一つ書き込むのと、1バイトのファイルを100GB分毎回書き込むのでは違うと思うのだが? >>199 配列をアホみたいに増やしたらメモリー(SSDで仮想いくらでも増やせるし)が一杯になる前に落ちる
208 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 23:41:21.09 ID:0HO5/jac.net] >>204 意味不明。 細かいファイルの件なんか、俺のコードにも、>>186 にも>>188 にも 全く触れられてないんだけど? 百歩譲って、断片化の可能性が高まるのは、open/close を繰替えす >>188 のコード(膨大な処理時間中に他のIOが割って入る)だが、 擁護してんのか晒してんのかも不明。
209 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 23:49:21.59 ID:xguVhByI.net] >>202 > ちなみにフラッシュしようが、出力される量は変動しないんだから、 > HDDの負担は変らん。と何回指摘されりゃ気が済むんだ? 出力される量は変動しなくても 書き込み回数は増えるじゃん。 フラッシュって何をやってるのか知らないの? HDDに書き込まないでメモリに蓄えているものを 書き出す処理だぞ。 だからHDDの負担は増える。
210 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 23:52:30.66 ID:xguVhByI.net] ちなみに、出力される量も実際に変動する。 HDDに限らないが通常書き込みっていうのは ブロック単位で書き込まれる。 HDDの場合は512バイトだったり最近は4Kバイトだったりする。 1バイトの書き込みでも4Kバイト書き込まれるわけだ。 だからデータ量が1000バイトだった場合、 フラッシュ無しだと4KBの書き込みだが 1バイト毎にフラッシュすると、4KB×1000=4MBの書き込み量になる。 ファイルサイズはどちらも同じ1000バイトであっても それを作るための書き込み量は違う。
211 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 00:08:38.69 ID:GclKUW1b.net] >ちなみにフラッシュしようが、出力される量は変動しないんだから、 >HDDの負担は変らん。と何回指摘されりゃ気が済むんだ? この二行は、あなたのご指摘通り。 訂正します。 >>188 の >$| = 1; は、*OUTのフラッシュになんの関与もしていないけど。
212 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 00:32:22.24 ID:Yqh2uzvZ.net] >>205 205-206が言いたいこと言ってくれた 擁護でも晒すわけでもなく、より適切な方法が見つかれば良いと思う 185にしても、もっとバッファリングしてやればHDDへのIOが減りHDDの負担は減るんじゃないかなと 標準だと4/8KBでフラッシュしてるよね、これを100MBにすればHDDへの負担はぐっと減りそう 今時のキャッシュ大きめのHDDでどの程度意味があるのか分からないし 寿命に影響するかどうかは分からないけど毎日繰り返す処理なら意味があるかも >>208 そうなの?って思って調べてみた mikeda.hatenablog.com/entry/20090503/1241365884 みたらselectしないと効かないっぽいな
213 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 01:15:56.79 ID:w1lAZiF2.net] 夏場なんで、while ブロックの先頭に sleep 2 unless $. % 10000; を入れるとよい。2つの数字は調整してみてくれ。
214 名前:デフォルトの名無しさん [2016/06/13(月) 15:19:04.03 ID:bjrR9GHC.net] #!/usr/bin/perl -w use strict; use File::Path; use IO::File; sub diskstat { system(
215 名前:デフォルトの名無しさん [2016/06/13(月) 16:48:17.11 ID:bjrR9GHC.net] https://ideone.com/fUNKyh このプログラムの意図 : >>186 と >>188 の違いがディスクアクセスに及ぼす影響の検証。 明らかに >>186 よりも >>188 の方がシステムコールの回数が多い。 しかし、それだけでディスクアクセスに違いが出てくるわけではない。 実行時間を同程度にしてみたらどうなるだろうか。 実行する前に grep sda5 の sda5 を環境に合わせて書き換えてほしい。
216 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 01:15:43.18 ID:M6DJWkXG.net] > 実行時間を同程度にしてみたらどうなるだろうか。 実行時間を同程度にしたら、遅い方の書き込み量が減るから 比較にならんだろw
217 名前:デフォルトの名無しさん [2016/06/14(火) 20:04:47.85 ID:UhtJW9b9.net] プログラムを見てくれてないのかな……だとしたらその時点でもう対象外なんだけど。 ろくに見もしないで何を想像したの?
218 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 01:35:53.40 ID:7O5/ia9k.net] そう言えば古いDiffソフト(AikoWin)やたらHDDガリガリ音鳴ってたな あれ読み出しが少しずつでHDDに相当の負担が掛かるとか聞いたことがある 細かいファイルを書き込むのも良くないけど、自分でソフト作る時にには 呼び出しも気を付けないとまずいんだよなー
219 名前:211 [2016/06/15(水) 12:03:11.68 ID:rzJhZO2i.net] もう少しマシなプログラムを書いてみたよ。 https://ideone.com/Nh4Esi Linux 限定だけど無修正で実行できる。 実行時間は 5 分くらいかかるよ。正確なデータを得るにはそうした方がいいみたいなんだ……
220 名前:デフォルトの名無しさん [2016/06/15(水) 13:23:28.38 ID:rzJhZO2i.net] 自分の実行結果を書いておくよ。 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 セクタ書き込んだみたいだよ。もちろん書き込んだ回数だよ。
221 名前:デフォルトの名無しさん [2016/06/15(水) 17:57:12.29 ID:rzJhZO2i.net] https://ideone.com/K0qeSx もう少しユーザーフレンドリーな感じにしてみたよ。これで最後だよ。 Windows ではこういう情報を得る方法は無いの? 非同期書き込みが無いのなら彼らの言うことも間違いではないんだけど。
222 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 11:42:41.43 ID:zTifxauk.net] $ perl -p -e 〜 となっているのですが、-p と -e の意味を教えてください。
223 名前:218 mailto:sage [2016/06/18(土) 13:00:49.64 ID:zTifxauk.net] 一行構文の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 と出てしまいます。 解決方法を教えほしいです。
224 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:07:12.42 ID:FKPQs3z7.net] 'print "\n"'ではなく"print qq(\n)"のように
225 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:22:55.12 ID:zTifxauk.net] C:\perl\bin\perl -e 'for $i (@ARGV) { "print $i ,qq(\n)";}' args1 args2 args3 で試したがダメでした…
226 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:58:07.42 ID:h9LNivvl.net] >>222
227 名前: 俺は昨日から始めたんで確かなことは言えないけど、 DOSプロンプトだと、''で括ってもダメだったよ (何か設定があるんだけど昨日からなんで...) 例えば、 perl -e 'print "hello"' は perl -e "print \"Hello World\n\"" ってしないと動かなかった [] [ここ壊れてます]
228 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 15:22:54.54 ID:h9LNivvl.net] よくよく考えたら、コマンドプロンプトで''はいけるはず無いよね だって、まずコマンドプロンプトで命令が解釈されるわけだから 'a b'だと、連続した文字列とはならずに 'aとb'の2つの引数が指定されたと受け取られちゃうわけだしね
229 名前:デフォルトの名無しさん [2016/06/18(土) 15:30:14.88 ID:xZeqh3Cr.net] Perl の文法上 "\n" の代わりに qq(\n) と書けますよ……という話じゃないのかなあ。 とりあえず、ググって見つけたページ thinca.hatenablog.com/entry/20100210/1265813598 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 に乗り換えたのは前世紀のことなのに……
230 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 17:13:02.52 ID:Q2VQ6qXf.net] DOS/Windowsコマンドプロンプトのクォートは " UNIXのシェルのクォートは ' ただそれだけ コマンドプロンプトのクォートとして "" を使っているから、Perl部分は qq() を使ってる
231 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 17:51:48.00 ID:5RdW1n8d.net] すごいにゃー。ワシは動けばいいやなんで。
232 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 17:53:59.52 ID:qpxG5nAO.net] 動かないんだろ?
233 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 20:50:09.79 ID:QKdVDmdU.net] PowerShell_ISE では、どうなる?
234 名前:デフォルトの名無しさん mailto:sage [2016/06/19(日) 20:43:06.86 ID:p98kttl2.net] ファイルの中身じゃなくて、ファイル名をバイナリかなんかで扱いたいときはどうすれば良いでしょうか どっかの国のどっか語でファイル名書いてあって、ファイル一覧を入手したら全部文字化けみたいな感じになってて困った
235 名前:デフォルトの名無しさん [2016/06/19(日) 22:30:28.43 ID:/GELYJ8A.net] まず、そのファイルが壊れてないかどうかエンコーディングが判らないことには確認しようがありません。 そして、そこに書かれているファイル名が正しいとしても、問題はそのファイル名で何をするかです。 ファイルを作成するとしたら少々困難を伴うと思いますが、何をしますか? もう少し説明が欲しいです。
236 名前:デフォルトの名無しさん mailto:sage [2016/06/19(日) 23:56:05.73 ID:p98kttl2.net] 1: ファイルは壊れてないです。あとファイルの中身はどうでも良くて困ってるのはファイルですね。 2: こちら側からバイナリを含めて希望してるのでそもそも文字コードは問わないです。 なおwindowsですので強制的な解釈としてはcp932でしょうか。文字かどうかは不明ですか。 3: 書いてある通り、ファイル一覧を入手したいです。(と言うよりすでにしました)。その時点での文字化けについてです。
237 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 01:41:13.70 ID:Nxz2d29B.net] 文字化けは君の環境のフォントの問題では…
238 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 01:52:28.59 ID:3dbzY2ue.net] >>225 単にprintのあと改行したいだけなら、面倒なエスケープを避けてsayを使うのが楽だと思う。 perl -E ‘say “hoge”;’
239 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 01:55:16.19 ID:3dbzY2ue.net] >>232 CPANにあるWin32::Unicodeを使ってみてはどうだろう。
240 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 02:14:22.79 ID:JJJI2UNm.net] ちゃんと話を追ってればシングルクォートではコマンド文字列をperlに渡せないってことを理解できるのに だから>>221 では全体をダブルクォートで括ってるわけ
241 名前:230 [2016/06/20(月) 13:40:47.81 ID:cF0IFcLP.net] >>232 「そのファイルが壊れてないか」と書いたのはファイル一覧のことだったんですが…… まあ、それは置いといて。 困っていると言われても、何をお望みなのかよく分かりません。 マルチバイト文字を作成者が意図した通りの文字として読みたいということなら、 やはりエンコーディングを知る必要があります。 そして、そのエンコーディングを扱うことが出来るソフトウェアと、もちろんフォントも必要です。 どんな環境で、どこからどのような手段で入手して、何をして文字化けだと思ったのか、 それがどうなるのが望みなのかを書いていただけないと、お役に立てそうもありません。
242 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 14:10:59.68 ID:ppvG3ddJ.net] ファイル名はテキストだろ。 バイナリのファイル名など、聞いたことがない フォントが無いだけで、たぶん正常だろ。 それか、ファイル一覧を表示している、端末の文字コードが違うだけ そのファイル名をエディタにコピーして、色々な文字コードに変えて、試してみる
243 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 14:43:14.96 ID:og12Zqf+.net] 先日も申しましたが、ファイル名はOSの仕様によってcp932扱いで表示されたバイナリです。 windowsにおけるバイナリとテキストの違いは、改行など一部の文字の解釈です すなわち、ファイル名を入手した時点で破損しています
244 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 15:21:44.17 ID:7O0ObdXP.net] うーん・・・ 関係ないけど ハートマークのファイル名作ったけど、 ちゃんと表示できたよ
245 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 15:27:52.95 ID:JJJI2UNm.net] >>239 「ファイルはテキストだが何のコードでエンコードされたものかわからん」をcp932で開いた ではなくて 「cp932でエンコードしてしまって、もう元のファイルの情報は欠けてしまった文字化けファイル」を開いた ってことか?
246 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 16:05:49.21 ID:S2CnEqh7.net] >>239 破損とは何か。期待値と実際値を言わないとわからん
247 名前:デフォルトの名無しさん [2016/06/20(月) 16:53:54.14 ID:cF0IFcLP.net] もう一度聞くけど、どこからどのような手段で入手して、どうやって見てるの? どうなってほしいの? 使ったソフトウェアの仕様はちゃんと理解できてるの?
248 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 23:26:05.47 ID:og12Zqf+.net] Aディレクトリの中のファイル名をopendirでとってくる。 この時のファイル名ってどう言う扱い?バイナリ?テキスト?コードは?フラグは? とってきたらそれがすでに破損してて開くこともできない。
249 名前:デフォルトの名無しさん mailto:sage [2016/06/20(月) 23:27:22.44 ID:og12Zqf+.net] もちろん cp932で定義されてる範囲のバイト列ではバグらないよ
250 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 00:30:40.48 ID:zxMwhnoQ.net] そうですか。 で?
251 名前:デフォルトの名無しさん mailto:sage [2016/06/21(火) 12:21:49.21 ID:yHwsrvxs.net] ------------------------------------------------------- Perl に関係ない話題は、以上で終了。
252 名前:デフォルトの名無しさん mailto:sage [2016/06/22(水) 02:03:09.88 ID:pkNIGL7K.net] >>ファイルの中身じゃなくて、ファイル名をバイナリかなんかで扱いたいときはどうすれば良いでしょうか 特別なことをしなければバイナリで扱うことになる。むしろファイル名は文字列では扱(え|わ)ない。