Perlについての質問箱 63箱目
■ このスレッドは過去ログ倉庫に格納されています
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/ >>761 > もしプライベートな内部やプロジェクト固有の用途のために開発中のモジュールが 決して公開されることがないなら、 > 将来の公開モジュールと名前が 衝突しないことを確実にしてください。 > これは、予約済みの Local::* カテゴリを使うか、 Foo_Corp::* のように 名前にした戦を含めることで行えます。 これだあああ 戦ってのが謎ですが、Localディレクトリに入れることにします。 ありがとうございます! たぶん「した戦」→「下線」アンダーラインのことかと > Foo_Corp::* のように 名前に下線を含めることで なるほど… ちゃんと訳した上で漢字を変な読み方した状態でのタイポとはw 今とあるスクリプトを見たら 1 while(s/[\012\015]$//); こんなん書いてあったんだけど、 たぶん改行とおぼしきものは全部消すってことだと思うんだけど、 いらんもんまで消しすぎたりしてない? スカラー末の改行(の連続)を外す。 スカラー内の改行は外さない。 作者の意図通りに、余分なものは消さないと思うよ。 普通に、s/[¥012¥015]$//g ; すりゃいいと思うけど、、、 文字の末尾が012か015だったら消すんじゃない? 文字コードもわからないけど 動作は >>769 の通りだと思うけど 1 while が意味不明だな while 1 はマニュアルにも記載されてる基本的な手法 条件だけで実行が完了する 勉強し始めて1日で覚えるようなことを全然分からんようなやつが回答者ぶってるのかよ とりあえず一通り調べたけど、末尾に改行を使う文字コードはなかったから、 1 while(s/[\012\015]$//); これは本当に改行を削除したいならあらゆる方法の中で最善だと思われる 本当にかたっぱしから消したいのなら、だけど… と言うより $ が自動でその判定してるから、関係ないものは消えないはずなんだよね 取り敢えず、ベンチマーク。 $ cat bench.pl #!/usr/bin/perl use Benchmark qw( cmpthese timethese ) ; my $f = +( "42¥r¥n" x 1000 ) . +( "¥r¥n" x 10000 ) ; sub _gm { my $f2 = $f ; $f2 =~ s/[¥012¥015]$//gm ; } sub _while { my $f2 = $f ; 1 while $f2 =~ s/[¥012¥015]$// ; } cmpthese(timethese (undef, { while => '_while', gm => '_gm', })) ; $ perl bench.pl Benchmark: running gm, while for at least 3 CPU seconds... gm: 3 wallclock secs ( 3.36 usr + 0.01 sys = 3.37 CPU) @ 356.68/s (n=1202) while: 3 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 152.94/s (n=468) Rate while gm while 153/s -- -57% gm 357/s 133% -- あ、単純に変数最後の CRLF 削りたいだけなら、比べ物にならん程 chomp の方が早い。 local $/ = “¥r¥n” ; chomp $_ ; ActivePerlとCygwinの両方で動くようにしようと思うと、chomp使えないんだよな ん? どっちが悪いか知らんが、 local $/ = “¥012¥015” ; も効かんの? \rだの\nだの使ってることに神経を疑っちまうぜ と言うかutf8にさえ文字とみなされない文字を使ってる時点で… ところで以下の3つは全部挙動が違いので並列にベンチとっても無意味 chomp; s/[\012\015]$//gm; 1 while(s/[\012\015]$//); 特に真ん中のは色々とひどいことになると予想した >>780 I/Oと言うのはその名の通りIとOがあってだな >>781 ご指摘の通り俺が間違ってたわ。 chomp が違うのは同意 #!/usr/bin/perl use Benchmark qw( cmpthese timethese ) ; my $f = +( "42¥012¥015" x 1000 ) . +( “¥012¥015" x 10000 ) ; sub _gms { my $f2 = $f ; $f2 =~ s/[¥012¥015]$//gms ; } sub _while { my $f2 = $f ; 1 while $f2 =~ s/[¥012¥015]$// ; } cmpthese(timethese (undef, { while => '_while', gms => '_gms', })) ; Benchmark: running gms, while for at least 3 CPU seconds... gms: 4 wallclock secs ( 3.24 usr + 0.03 sys = 3.27 CPU) @ 391.13/s (n=1279) while: 3 wallclock secs ( 3.01 usr + 0.03 sys = 3.04 CPU) @ 155.26/s (n=472) Rate while gms while 155/s -- -60% gms 391/s 152% -- >>783 は上手く動いてねーw すまん。全面的の俺のレスは脳内から消してくれ。 連レスすまん。これを最後に消える。 s/[¥012¥015]¥Z//gm 出力を od -d -a で確認したから合ってると思う。 でベンチマーク取ったけど、記憶にある通りのベンチになった。 通りで>>777 、>>783 が遅いわけだわ。 うーん いくら考えても 1 while() と書いてる意味がわからん gオプションついてないから while の意味ないし 結果知りたいなら s/// の値を直で調べりゃ済む話だし 何故なんだ 誰か教えてください 量指定子の存在しない世界線なのか。 #!/usr/bin/perl -w use strict; sub hd { print '[', join(' ', map uc unpack('H2', $_), split //, $_[0]), "]\n" } my($lf, $cr, $n) = ("\012", "\015", "\n"); my $str = "$n$cr$lf$lf${cr}1${cr}2${lf}3$cr${lf}4${n}5$n$cr$lf$lf$cr$n"; $_ = $str; 1 while s/[\012\015]$//; hd($_); ($_ = $str) =~ s/[\012\015]$//g; hd($_); ($_ = $str) =~ s/[\012\015]+$//; hd($_); __END__ なお改行が \015 でも \012 でもそれらの組み合わせでもない環境があるので、 $ と \Z と \z の意味するところは元のコードが使われていた環境に依存する。 http://perldoc.jp/docs/perl/perlport.pod#Newlines ありがとう すごくよくわかった 1 whileの挙動をなにか勘違いしていたみたい そしてベンチマーク取ってみたら 1 while s/[\012\015]$//; よりも while(s/[\012\015]$//){} の方が微妙に速かった (すごく微妙なんだが 毎回1を評価しないでいい分の差??) そして s/[\012\015]+$//; は1桁近く遅かった そうだったんだ… オレ速度はあまり気にしないから、いつも素直に s/(?:¥r?¥n)+$//; の感じだな。 ¥b入れた方がいいのかもしれないけれど入れたことはない。 $とって、gつければ、改行全部きえるはずだよ。 (行単位に分離されてそうだけど。。。) >>789 一体どんな計り方をしたんだ。 http://perldoc.jp/docs/perl/perlperf.pod http://perldoc.jp/docs/perl/perlcompile.pod#The32Decompiling32Back32End #!/usr/bin/perl -w use strict; use Benchmark qw(cmpthese); my($lf, $cr, $n) = ("\012", "\015", "\n"); for my $str ("$n$cr$lf$lf${cr}1${cr}2${lf}3$cr${lf}4${n}5$n$cr$lf$lf$cr$n", "abc$n", 'abc') { cmpthese(-5, { ws => sub { $_ = $str; 1 while s/[\012\015]$//; 1 }, wb => sub { $_ = $str; while (s/[\012\015]$//) {} 1 }, qu => sub { $_ = $str; s/[\012\015]+$//; 1 }, }); print "\n"; } __END__ これぐらいシンプルな正規表現なら エンジン内でのバックトラック >> 文自体の反復 >= ループ構造 文字列内に [\012\015] にマッチする文字があればあるほど qu の方が速くなる。 こんな計り方↓ #!/usr/bin/perl use strict; use warnings; use Benchmark qw/:all/; my ($lf, $cr, $n) = ("\012", "\015", "\n"); my $str = "$n$cr$lf$lf${cr}1${cr}2${lf}3$cr${lf}4${n}5$n$cr$lf$lf$cr$n" x 100; cmpthese -5, { '1while' => sub {$_ = $str; 1 while s/[\012\015]$//;}, '1while_g' => sub {$_ = $str; 1 while s/[\012\015]$//g;}, quantifier => sub {$_ = $str; s/[\012\015]+$//;}, while_g => sub {$_ = $str; while (s/[\012\015]$//g){};}, while => sub {$_ = $str; while (s/[\012\015]$//){};}, }; __END__ 同じwhileでもgオプションつけると微妙に速くなる 面白い >>792 自分の感覚と真逆の結果なんで -Mre=debug して調べたら、 [\012\015]$ だと 固定長だからエンジンが動作を最適化して最初から末尾しかみないんだな。 だから文字列自体が長くなると逆転が起こると。勉強になったよ。 #!/usr/bin/perl -w use strict; use Benchmark qw(cmpthese); my $n = "\015\012"; my $sa = $n x 500; # 全文字にマッチ my $sf = ($n x 250) . ('a' x 500); # + の場合前半に長くマッチした上で失敗する my $sl = ('a' x 500) . ($n x 250); # 後半に長くマッチ my $sn = 'a' x 1000; # マッチしない my $su = ('a' x 998) . $n; # 末尾のみ cmpthese(-5, { wa => sub { $_ = $sa; 1 while s/[\012\015]$//; 1 }, wf => sub { $_ = $sf; 1 while s/[\012\015]$//; 1 }, wl => sub { $_ = $sl; 1 while s/[\012\015]$//; 1 }, wn => sub { $_ = $sn; 1 while s/[\012\015]$//; 1 }, wu => sub { $_ = $su; 1 while s/[\012\015]$//; 1 }, qa => sub { $_ = $sa; s/[\012\015]+$//; 1 }, qf => sub { $_ = $sf; s/[\012\015]+$//; 1 }, ql => sub { $_ = $sl; s/[\012\015]+$//; 1 }, qn => sub { $_ = $sn; s/[\012\015]+$//; 1 }, qu => sub { $_ = $su; s/[\012\015]+$//; 1 }, }); __END__ こちらこそ勉強になりました まぬけな質問 >>787 やとんちきなベンチマーク >>792 でも 役に立つ(?)こともあるんですな Perlに向いてるIDE教えて デバッグ機能とかはいらない 補完と文法チェックとオートインデントが欲しい CPANとの連携機能はどっちでもいい みんなメモ帳レベルのテキストエディタで書いてるの? どこまでがエディタでどこまでがIDEなのか分からないが、それなりの機能は欲しい 自作関数とかも補完して欲しいしなあ サンクス vscode調べてみる pythonもVBもバージョン上がると別物になる そして大抵古い方が使いやすい pythonはそろそろLinuxのデフォルトが3になりそうだけど Perlはそんな気配全く無いよねw システム付属のスクリプト言語っていう立ち位置がかつてのPerlからPythonに変わったからなあ >>810 Unicode Character 'ATOM SYMBOL' (U+269B) おいらのPCでは、コピペしてもフォントが対応していないので出てが。 環境によってはどうやってもアトミックにならんのでは 日本だとparameterもargumentもどっちも引数と訳して区別しないから、 何故ARGなのかピンときにくいな 引数は単に引数ってだけ。その使われ方は決まっていない。 例えば言語によっては関数の引数で戻り値を返すことだってできる。 つまり引数=パラメータではない また関数の引数の多くはパラメータになるが、 引数だけがパラメータではない。 環境変数でパラメータを渡すことも有る つまり「この関数の引数はすべてパラメータであり、引数以外のパラメータは取らない」 のような使い方をする なぜ $_ が ARGなのかというと 正式名称が「デフォルトの引数」だからである。 そういう理解なんだねとは思うけど、何も正しくない パラメータは、数学の媒介変数から借りてきた言葉で、 それを変化させると結果がいろいろ変わる変数 argumentは訳語が無いのでアーギュメントとするけど、 これは仮引数とも訳されて、関数を定義する時に便宜的に使われる名前 y = f(a) と使うけど、定義では f(x) = x*x みたいに違う名前で書く ここで、aがパラメータで、xがアーギュメント 引数として使ってるものが引数 パレメータとして使ってる物がパラメータ パレメータでぐぐると600件くらいヒットするから、 それなりに認知された用語だ たまにいるよな。 大抵のカタカナ英語は日本語風に書いているのに 特定の単語だけネイティブ風に書くやつ より正確な英語の発音にこだわってるんだー風を だしていながら、その他のよく知られたカタカナ英語は そうやってないから、ものすごく恥ずかしい 何言ってんだかさっぱりわかんないな。 これじゃ駄目なん? 普通にパラメータに聞こえますけど。 http://ejje.weblio.jp/content/parameter 元凶は日本のマスゴミなんだから逆らって アイフォーンをアイフォンとかは全然いいんじゃない? アイフォーンはアイフォーンだろうがゴミ 日本企業の商標を無視するとか朝鮮人かよ 先にアイホンがあったから、アイフォンって名乗れないだけだけどな disableをディセーブルだと判ってるのに、どうしてもディザブルと読んでしまう >>836 お前PCニュース板で荒らしって叩かれてるやつだろw 質問ですが required.plをtest.plからrequire './required.pl'としたとき、 required.plの中でuse strict;と書いてもtest.plがstrictにならないのに required.plの中でuse CGI;と書くとtest.plでmy $q = new CGI;できてしまうのは何で? use xxxx;にスコープの違いがあるとして、何読んだらワカル? ちなPerl 5 (v5.16.1) >>838 =ゴミ言語に合理性や整合性を求める知恵遅れ 社会のお荷物だよお前 >>841 レスdくすあり〜 Perl 4時代のCGIをメンテ中なう、、 new CGI;すると何かページの挙動が変わってしまうので結局CGI使わずに調査することにすた、 >>838 そもそも概念が全く違うな CGI->new が呼び出せるように strict->importは呼び出せるようになっているし パッケージの定義がグローバルな名前空間に行われてるのは同じ strictの有効化はコンパイル時のperl内部のスイッチの切り替え 同じ use でもやりたいことが違うからスコープの違いという視点で整理しようとすると混乱しそう 文字列$str2から文字列$str1に含まれている文字以外を全て削除する 例えば$str2="あaかbさcたdなe";$str1="あかさたな";ならば absdeが残るということです モジュール使えない環境なのでモジュールなしのやりかたで $str2="あaかbさcたdなe"; $str1="あかさたな"; $str2 =~ s/[^$str1]//g; print $str2; # あかさたな 正規表現は書けても実行しようとするとむちゃくちゃ遅くなったり メモリ足りなくなったりして、結局ループに開いたりする あああああああああまははあああああああああああああああああああああなやたはあああああああああああああああなはわたはなたかかなななななああああああああああああああああああああああああああああかかかかあああああああああああああかささやなさはななけなわまややゆか >>846 そのやり方だと $str2="あaかbさcたdなe";が $str2="あaかbさcたdなはe"; だったら結果が文字化けする >>847 それは大抵バックトラックのせいだからバックトラックを減らしなさい。 たとえば、単に \s* ではなく (?>\s*) と書く。 Perlは正則言語を最左導出に変換していないとか一体… まあ一般に状態数が増えてメモリ食うけど ファイルロック用のファイルを使ってロックしている最中に 他プロセスでそのロック用ファイルを削除すると ロック解除されてしまうの? ロックしているファイルを、他のプロセスは削除できないだろ 試してみれば? 見事にヴァカが釣れたw 腹痛いwwwwwwwwwww 試してみたけどwindowsサーバーだとロック中のファイルは削除できないけど unixサーバーだと削除できてしまってロックが解除される だからロック用ファイルは削除しないでそのまんまの方がいい >>859 unixでファイル削除してもロックは解放されない >>860 それどころか同名のロックファイルを作れるから 面倒なバグを生むよな 初心者がほんとによく作るバグが 「ロックを解放したらロックファイルも削除する」 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる