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/ >>443 「WindowsのFork」の意味は分かりませんが(Windows用PerlのFork?)、 Cygwin の perl は、 C:\cygwin64\bin\bash --login -i -c "perl ... 等としなくても、Windows から直接起動出来るので、 あのスプリクトで直接起動しても、メモリエラーは出ませんでした。 Cygwin の perl を、Strawberry Perl の代わりに、、、と思ったら、 いきなり chomp が、CR+LF を削除してくれなかった。 >>444 perldoc.jp からのコピペです。 >>445 if ( 文字列 =~ /パターン/ ) もし「文字列」の中に「パターン」が含まれていれば、 if ( $hoge =~ /(\d+)$hoge3$/ ) { $hoge2 = $1 } もし「 $hoge 」の中に「 \d+$hoge3$ 」が含まれていれば、「 $hoge2 」に「 \d+ 」を代入 >>446 ありがとうございます。 他言語の底辺SEなので助かりました。 普段それを読む文化にない人がいきなり読めたら逆にすごいと思う PerlってPerlが分かる人だけの言語 Perl on Bash on Ubuntu on Windows10 での、 モジュールのインストールで、無駄に苦労した。 解決法: Config.pm の修正 Windows10 のコマンドプロンプトでも、 エスケープシーケンスが使えるらしい。 PROMPT $E[96m$T$E[3D $E[93m$P$G$E[37m$E[1C 懐かし C:\> prompt $e[1;36m[$d$s$t$h$h$h] $e[1;33m%USERNAME%@%COMPUTERNAME% $e[37m$p$_$g$s ビット演算を多用したいんだけど、変数のサイズを指定したい。longとか。 とりあえず、16bitと32bitと64bitの整数が欲しい。 あと数値と文字が勝手に切り替わらないようにしたい。 ビット演算してるブロックだけでいいんで。 あと環境の保証も欲しい。どのマシンでどのbitのPerlとか関係なく。 俺が32bitのビット演算って言えばそれはもう絶対32nit演算。 もちろん不当に遅くなる方法は許さない。 vec かな。それでも不満なら perlfaq3 を読んで C で書け。 実際に何をして、その結果何が問題だったの? そのくらいは書いてくれないと…… >>457 xsと言うのがあるが、一時的に値が複製されて良いなら標準入出力(メモリ渡し)のほうが絶対に楽だと思うのだ。 ま、perl使ってるなら複製されたメモリのほうが元のデータより圧倒的に小さいはずだが ビット演算したいなら普通にすればいいよ。 ◯ビット変数がほしいといわれても、それは適切にマスクすればいいだけだし。 ◯ビット変数のように振る舞うものがほしいということなら、Perl は C よりも期待に応えられると思うよ。 まずは C と同じ書き方をして速度を計ってみてよ。話はそれからだ。 もう連休終わっちゃうんだけど結局何をしたかったのかな。 その日のうちに解決したんじゃね? 木曜日の相手になに言ってんだか しかし普通の言語やったあとにPerlやると異常なほど即座に短く書き終えるからなにか書き忘れてるんじゃないかと不安になる。 正しく動くと分かると異常なほど楽で嬉しくなるし、C++とかが馬鹿らしくなる。 そして実行速度計ると結局全部納得してため息。 stat($file_path);でファイルを作成したtimeは atime,mtime,ctimeのどれなの? >>468 http://perldoc.jp/func/stat > 8 atime 紀元から、最後にアクセスされた時刻までの秒数 > 9 mtime 紀元から、最後に修正(modify)された時刻までの秒数 > 10 ctime 紀元から、inode 変更(change)された時刻までの秒数 (*) > 明らかに、ctime のフィールドは移植性がありません。 > 特に、これから「作成時刻」を想定することは出来ません http://perldoc.jp/docs/perl/perlport.pod#Files32and32Filesystems > ファイルシステムはアクセスタイムスタンプや変更タイムスタンプに > 対応していないかもしれません (つまり移植性のあるタイムスタンプは > 変更タイムスタンプだけです); またタイムスタンプは 1 秒単位では > ないかもしれません (例えば、FAT ファイルシステムは時刻の単位は > 2 秒単位です)。 >「inode 変更タイムスタンプ」 (-C ファイルテスト) は (Unix 以外では) > 実際には「作成タイムスタンプ」かもしれません。 Perlのオブジェクト指向読んだばっかりで理解が曖昧なんだけど、 これだと、オブジェクトがオブジェクトなのか関数なのかって呼び出し側で決める事にならない? コンストラクタもメソッドも。 ついでに、インスタンスのカプセル化どうこうも、呼び出し側の権利? みたいに見えたのですが。 >>471 ありがとう 以下みたいな感じの記述は使っても問題ない? あと穴があった場合も教えて欲しい。 (複数回に分けて書くので途中で書けなくなるかも) use utf8; use strict; use warnings; #ただの実験 # 1: メソッドとインスタンスをカプセル化する。 # 2: クロージャを、あたかもオブジェクト指向と同じ記法で呼び出せるようにする。(クロージャとオブジェクト指向の同一視) # 3: クロージャをクロージャのまま使いたければそうできるようにした。そもそもクロージャのほうが速いので。 { package Class; sub new{ my $class = $_[0] eq __PACKAGE__ ? shift : undef ; #オブジェクトとして呼び出されたかどうか my $self = { Name => shift, }; my $method = { NameGet => sub{ $self->{Name} }, NameSet => sub{ $self->{Name} = shift; }, }; return $method if(!$class); # 普通の関数(クロージャ)として呼ばれた場合 return bless $method, $class; # オブジェクトとして呼ばれた場合 } sub AUTOLOAD { our $AUTOLOAD; my $method = shift; ref($method) eq __PACKAGE__ or return("error"); my @load = split '::', $AUTOLOAD; my $load = $load[-1]; $method->{$load}->(@_); } } { package test; my $c = Class::new("Closure"); #クロージャとして呼び出すと、一般的なクロージャと同じように使える。 print $c->{NameGet}->() . "\n"; my $o = Class->new("Object"); #オブジェクト指向として呼び出すと、オブジェクト指向と同じように使える。(中身はクロージャ) print $o->NameGet() . "\n"; print Class::NameGet(); #関数のように呼ぶとエラー } __END__ 以上です オブジェクト指向=カプセル化ではないし、perl5でももう少しスマートなカプセル化のやり方もあるが筋が悪いからおすすめはしない perl6はオブジェクト指向に関してはかなりマシだけど、そもそも速度気にするならperlは向かない perl5じゃないとダメなら規約などで上手く付き合うしかない ちなみにそのコードだとまともに継承できないね やりかたがあると言うのなら、提示して欲しいのだけど。(ただの俺は知ってるぞ自慢?) 事前に試しましたが、継承はできましたよー。 複数クラスを書くと長くなるので書きませんが、 まったく同じように別のクラスを書いて、ベースにしたいクラスを呼び出して更新すれば とりあえずインスタンスもメソッドは継承されるですね。 あと穴は一つ発見しました。 これは後出しにしようかな。 スーパーコンピューターのアプリケーションしか作ったことがないのですが、 そんな私でも作れるでしょうか? スパコンのSIMDやMPIの方が楽だから 無理しなくていい 2つのテキストファイルを比較し、一致した文字列を取り出したいんですが、教えていただけませんか 一致した文字列を穴なく完璧に厳格に定義して示して下さい。 そしてそれが出来ればプログラミングの8割は終了しています。 diff 系かなあ。CPAN で検索してみるといいよ。 Perl使うまでもないような cat fileA fileB | sort | uniq -d いやいや、一致した「行」とは言ってないから。何を望んでいるのかを確認しないと。 単語だと形態素解析が必要になるけどこいつにそんな課題出さないだろう my $input = []; CSVファイルを一行づつ配列にして多元配列にした後 for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";} で全データ出力するのですが、その後(?)関数内で同じく for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";} とすると、1行目の内容が、$#$inputの数だけ繰り返し表示されます。 関数内でも全データを出力したいのですが、どうしたらよいでしょうか。 どなたか教えてください。よろしくお願いします。 1回ずつループしながら、デバッグして、使っている変数を見れば? 変数のwatch 機能、あるだろ? >>489 アドバイスありがとうございます。VisualStudioCodeを素で使ってまして perlのwatch機能は無いようなのです。 watch機能はないのですが、添字の$iを具体的な数字を入れてはprintで確認して 1行目のデータになっていると気づいた次第です。 >>488 こういうこと?再現しないよ use Data::Dumper; my $input = ["abc", "def", "ghi"]; for(my $i=0; $i<=$#$input; $i++) { print Dumper($input->[$i]), "\n"; } &func; sub func { for(my $i=0; $i<=$#$input; $i++) { print Dumper($input->[$i]), "\n"; } } >>492 要はそういうことなんだと思います。csvファイルを読み込んで $input[[1, 2, 3],[4, 5, 6],[7, 8, 9]]; for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";} でDumperのフォーマットですが[1, 2, 3],[4, 5, 6],[7, 8, 9]を表示 sub funcの中で同じforをすると Dumperのフォーマットですが[1, 2, 3],[1, 2, 3],[1, 2, 3]を表示します。 必要なところを抽出して現象がでたらソースをアップします。 ループ内で行っていた条件分岐の間違いでした。お騒がせしました。 489さん、492さん、ありがとうございました。 良い回答はないと思うんだけど、正規表現で指定する内容をランダムで作り出す方法ってないかな。 例えば /^[0-9][0-9a-zA-Z]{4}[A-Z]$/; だったら 5scDuZ とかが得られますよ的な。 CPANのモジュールも更新されないものが増えてきた もうオワコン Windows環境でUnixのテキストファイルを処理します 改行LFがCR+LFに変換されてしまうのを防ぐために perl -i.bak -p -e "BEGIN{ binmode STDIN; binmode STDOUT; } s/unko/manko/g;" hogo.txt みたいな風に書いてるんですけど もうちょっとスマートな書き方ありませんか? binmodeしないと自動変換されるの? まぁ試してないけど、ワンライナーをやめれば良いのさ perlの場合は文字コードがEUCのデータファイルがあって 入力フォームからハングル文字で書き込むと自動的に&#○○○;の形に変換されて書き込まれるのですか? 最近はフォームを知らない人がいるんだ おぢさん、世代ギャップを感じるよ うわ、知能障害者がまた来たよ。 それともゆとり世代の代表例かな? my $str = "aaa〹&bbb&ccc"; という文字列があって &#以外の&を&に置換するやり方は? my $str = "aaa&#12345;bbb&ccc"; という文字列があって &#以外の&を&に置換するやり方は? #はここでは全角で入力したけど半角です 訂正 my $str = "aaa&#12345;bbb&ccc"; という文字列があって &#以外の&を&amp;に置換するやり方は? #はここでは全角で入力したけど半角です s/&(?!#)/&amp;/g (?!...) 否定先読み こういう時日本語は全角文字を使えて便利だね 海外の人は&や#が入力できない時苦労しそう 文字参照で書けばどうか? s/&(?!#)/&/g できました それとこの文字列で my $str = "&amp;&amp;&am"; それとこの文字列で&amp;でない&(この場合一番後ろの&)を&amp;に置換するには どうすればいいんでしょうか? それも否定先読みじゃないの 同じようにやってごらん すみません教えてください。 DBD::CSVというのは 標準モジュールに含まれるのでしょうか? >>517 http://perldoc.perl.org/perlmodlib.html Perl の標準モジュールではないが Active Perl のようにバンドルされているディストリもある >>518 ああ、DBIは標準モジュールじゃないんですか。 ありがとうございました。 >>519 なるほど納得です。 開発環境がAcrivePerlで、libに入ってるモジュールは標準と思ってました。 ありがとうございました。 perlの乱数生成器の内部状態を保存するにはどうしたらいいですか seedだけ保存しても100万回 rand を呼んだところで中断したら再開するときまた100万回呼ばないとダメですよね と言うか動作の保証が求められる乱数みたいなのはオブジェクトごとに専用で実装する 乱数用のモジュール使うしかないんだろうけど有名どころの Math::Random::MT は状態保存はできないみたいだな pure perl実装の方は無理矢理シリアライズすればできそうだけど 再現性が必要な乱数は、一旦作成してファイルに保存して利用する push pop shift unshiftが未だにどれがどうだったか覚えられません。 毎回ググるのも面倒なのですが、何か覚えるコツみたいなものはありますでしょうか。 ディスプレイに付箋を貼るのは嫌です。 あああ、オレも覚えるのに苦労した だって、アセンブラの push 命令とは伸びる方向が真逆なんだよ shift はバッチファイルにも同じ命令があるから分かるよね 前にズラす はい、お次の方、どうぞ、って感じ 朝勤、昼勤、夜勤、って感じ push は後ろから押す、背中から押す、ケツから押す、とにかく押すんだ 満員電車に乗るとき、押さないでください、押さないでください、って感じ スマホかどうか判別するには if( $ENV{'HTTP_USER_AGENT'} =~ /iPhone/ || $ENV{'HTTP_USER_AGENT'} =~ /iPad/ || $ENV{'HTTP_USER_AGENT'} =~ /iPod/ || $ENV{'HTTP_USER_AGENT''} =~ /Android/ ){ print "スマホだよ"; } これでいいんですか? push,popは一般的なCPU命令のpush.popと同じだね。スタック末尾に積んだり取り出したり。 shift,unshiftは直感的とは言いがたいけど、まあ覚えるしかない 対にして使うならば、push-pop、ないしpush-shift、unshiftはいったん忘れたほうがいい >>531 ,533-534 ありがとうございます。 pushは何とかそれで覚えられそうです。 何とかpush-shiftで覚えてみます。 >>530 レスしたいだけのゴミクズはさっさと消えろ。 まともに回答もできないクセに自己顕示欲だけは人一倍。 お前みたいな奴が社会のお荷物なんだよ。 お荷物=捨てるに捨てられないゴミ、だからな。 本当はさっさと処分したほうが社会のためだが憲法と法律によって処分できないだけ。 >>535 自己紹介乙 簡単なことも覚えられない記憶障害者か?それとも統合失調症か? 一行レスにこれだけの長文で応えるのは愛があるからだと思うの 無理のある例えだが、配列がロケット鉛筆だとしたら <0[1][2][3] ケツに押し込むのが push <0[1][2][3] ← [4] ケツから飛び出ちゃうのが pop <0[1][2] → [3] 芯を引っこ抜くのが shift <0 ← <0[1][2] 先から無理矢理突っ込んじゃうのが unshift → <0[1][2][3][4] まあどうせすぐ忘れるだろ 結局は染み付くまで調べるのを繰り返すしかない >>535 いやいや、毎回調べるのも十分ありだと思うぞ。 俺はそのうちになんとなく覚えちゃったことけっこうあるよ。 うろ覚えで使うとバグの発見に苦しむんで ほんのちょっとでも不安を覚える感じがしたら大丈夫だとは思ってても 必ず調べる方が良いよね 俺も毎回調べてることは色々ある 同じことを100回調べた疑いすらある そんなこと言ってるとまた精神障害者の>>536 に記憶障害とか言われるぞw 毎日のように使ってりゃそりゃ忘れることは無いだろうけど 数ヵ月とか間を空けると忘れてて調べなおすことはままある 記憶障害って言われるのはちょっときつい ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる