1 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 03:03:00 ] "The duct tape of the Internet" こと、Perl についての質問箱です。 "There's more than one way to do it" ということで、 Perl の奥深さについて皆で語り合い、追求してまいりましょう。 CGI についての質問は板違いです。WEB プログラミング板でどうぞ。 CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。 (WEB プログラミング板: pc11.2ch.net/php/ ) CGI の質問は答えが Perl と全然関係ない話に帰着する場合が 多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2009/08/07 現在の最新版: 5.10.0 ▼ 前スレ Perlについての質問箱 40箱目 pc12.2ch.net/test/read.cgi/tech/1243631674/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-6 あたり
752 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 15:35:33 ] そもそも、マニュアルに書いてあることが質問される時点で異常な状態だということを見失うなかれ。
753 名前:デフォルトの名無しさん [2009/10/07(水) 15:40:44 ] >>739 オフィシャルなドキュメントには記載が見つからなかったのです
754 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:17:48 ] >>752 googleで-Tを検索したら何も出てこなかったんだよきっと
755 名前:デフォルトの名無しさん [2009/10/07(水) 22:03:27 ] >>752 じゃあ、substrに代入したときの返り値を調べてみてよ。
756 名前:741 [2009/10/07(水) 23:02:37 ] >>755 あぁ、ごめん。741だけど > 代入型のsubstr この部分に全く目がいってなかったわ my $result = (substr($d[$i+1],rand($len),0)=$d[$i]); この$resultがどうなるかって意味だよね?それなら載ってないかも。俺が普段この書き方しないから空目した 自分で>>735 を書くとしたら下のような感じかなぁ my $str =<< "STR"; abcdef\n123456\nghijklmn\n78910223 STR warn $str; my @res; my @lines = split /\n/, $str; while (@lines) { my $line1 = shift @lines; my $line2 = shift @lines; print "num?: "; my $num = <STDIN>; my $length = length $line1; my $post = substr $line2, $num, $length, $line1; push @res, $line2 . $post; } print join "\n", @res, "\n";
757 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 04:05:10 ] >>755 なにがどう「じゃあ」なんだよwww
758 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 04:53:55 ] $ perldoc -f substr No documentation found for "perlfunc". ^^v
759 名前:デフォルトの名無しさん [2009/10/08(木) 06:39:44 ] >>756 マニュアルに記載のない使い方はしないほうがよいのか 代入文だからlvalueが保持されると考えるのがよいのかが知りたかった。 多分、後者だね。 コードについては、ヒアドキュメント使うと柔軟性に難があるから、下記のがいいかも。 @lines=<DATA>; (プログラム末尾) __DATA__ 入力データ 入力データ : あと、入力が偶数行でなかったときはこけるね。 入力の妥当性を調べるのはプログラムの仕事だよ。 それから、任意ってそういうことだったのかな? もとの要求が謎の多いものだから、こちらは乱数にしたのだけど。
760 名前:デフォルトの名無しさん [2009/10/08(木) 06:46:42 ] >>756 もう一度プログラム見た。 これ、正しくない。 挿入位置+1行目の長さが2行目の長さより短いと 順がおかしくなる。
761 名前:デフォルトの名無しさん [2009/10/08(木) 09:04:20 ] >>760 おぉ。ホントだ。台風で午前中休みにして暇になったから直した。 無理やりsubstr使う必要なかったな my @lines = split /\n/, $str; die unless $#lines % 2; my @res; while (@lines) { my $line1 = shift @lines; my $line2 = shift @lines; print "num?: "; my $num = <STDIN>; my $post = substr $line2, $num; $line2 =~ s/($post)$/$line1$1/xms; push @res, $line2; }
762 名前:デフォルトの名無しさん [2009/10/08(木) 11:53:43 ] ハッシュ%hogeで $hoge{$a}{$b}{$c}{$d}...{$n} を定義した順番でkeyを keysで取り出したい 普通モジュールの Tie:IxHash を使うらしいけど それだと最初の$aのkeyだけ定義順番でとりだせて %{$hoge{$a}}以降の深い構造でのkeyが 順番どうりならず、ばらばらにkeysで取り出されるようになる どうにかして定義した順番でどの段階でも 取り出せるようにしたいんだけど おしえて下さい。
763 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 12:04:59 ] >>762 キーを配列にとっとけ。 $hoge{$fuga}{$foobar} = 'bar'; push(@hoge, [$a, $foobar]);
764 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 12:07:39 ] $hash{a}{b}に値を入れる前に tie %{$hash{a}}, 'Tie::IxHash'; しておけば、 keys %{$hash{a}}は順番に取り出せるよ。
765 名前:デフォルトの名無しさん [2009/10/08(木) 15:42:29 ] 一度で深いところの値を定義することになるので (このように $hoge{$a}{$b}{$c}{$d}...{$n}=1) >>764 はつかえない あと同じkeyが何回もでてくる可能性があるので>>763 もつかえない (このように for $a (同じのあり) for $b (同じのあり) $hoge{$a}{$b}{$c}{$d}...{$n}++ ) あとでkeyをとりだすとき何回も同じのがでてきてしまう >>763 いい方法ないでしょうか
766 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 15:45:51 ] >>765 配列だから同じキーが何回出てこようとちゃんと 保存されていて問題ないはずだが?
767 名前:765 [2009/10/08(木) 15:46:38 ] あと tie すると前保持していた値がすべて真っ白になってしまうので 繰り返しのなかに>>764 は いれられない状態。 一日なやんでもいい方法が思いつかない
768 名前:デフォルトの名無しさん [2009/10/08(木) 15:52:52 ] a b c d a b c d e f a g a という順番でkeyがでてくるとする とりだすときは a b c d e f g でとりだしたいんだけど できる?>>766
769 名前:デフォルトの名無しさん [2009/10/08(木) 15:57:32 ] >>762 やり方が悪いので、データ構造を見直すべし。
770 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 15:59:54 ] >>768 そんなのすでに取り出したかハッシュで管理してとばせばいいだけだろ。
771 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 16:10:42 ] >>768 それこそハッシュ使って同じキーが出てきたらスキップするようにすればいい。 んで$hoge->{$foo}の階層だけとりだしたいなら、 whlile(@hoge){ next unless $_->[$foo]; my @keys = @$_; } で取り出せるだろ。あ、あと>>763 は間違いがあった。 間違い $hoge{$fuga}{$foobar} = 'bar'; push(@hoge, [$a, $foobar]); 正しい $hoge{$fuga}{$foobar} = 'bar'; push(@hoge, [$fuga, $foobar]);
772 名前:デフォルトの名無しさん [2009/10/08(木) 17:35:28 ] もしかしてこういうのでいいってオチか? print sort keys %hash; もしくは print map $hash{$_}, sort keys %hash;
773 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 18:44:55 ] よくわからんが、各層のキーをjoinしたものをハッシュキーにして Tie::IxHashを使えばいいんじゃないのか。
774 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 21:00:34 ] Perlで/etc/shadowに使うSHA512化されたパスワードを作ろうとしているのですが /etc/shadowとsaltとpasswordを同じにしても出てくるハッシュが一致しません。 もし他によい方法があれば教えて下さい・・・ #!/usr/bin/perl use strict; use Digest::SHA qw(hmac_sha512_base64); my $sha = hmac_sha512_base64("password","salt"); print "$sha\n";
775 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 22:25:23 ] Webリソースのバイト数を取得するモジュールって何かありますか?
776 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:12:20 ] >>775 Webリソースって具体的に何だ?
777 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:20:33 ] >776 タイミングが悪くて非常に申し訳ない。 自己解決しました^^; ダウンロード対象のつもりでした。html,zip,etc…
778 名前:デフォルトの名無しさん [2009/10/08(木) 23:21:56 ] perlってsocks串刺せますか?
779 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:27:55 ] uaでいいんじゃないのか?
780 名前:デフォルトの名無しさん [2009/10/08(木) 23:28:35 ] ua… LWP?とかいうのと関係ありますか?
781 名前:デフォルトの名無しさん [2009/10/09(金) 05:57:46 ] >>774 目的はクラッキング? フツウの人はシャドウなんていじらないもんな。
782 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 07:14:21 ] Pealのデバッガで変数を強制で変えるコマンドってある? 初心者な質問ですまん
783 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 07:45:58 ] perlな
784 名前:デフォルトの名無しさん [2009/10/09(金) 08:52:12 ] >>782 普通に代入じゃだめなのん?
785 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 09:14:52 ] >>774 そういうシステムならcryptもsha512対応してると思うので そっち使えばいいと思う。同じライブラリ呼ぶので確実な 筈だよ。 print crypt('password', '$6$salt');
786 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 14:08:33 ] >>774 車道クラックか? >>777 解決したならそれを書くのが筋。HTTPレスポンスのことならHTTPヘッダの Content-Length: 行で取れるよな。 >>782 スカラ型の内部値を変えたいのか?質問の意図がよくわからん。 数値にしたけりゃ $foo += 0; 文字列にしたけりゃ $foo .= ''; 内部的にリファレンスとか整数型にしたいとかだったら簡単な方法は知らん。
787 名前:774 mailto:sage [2009/10/09(金) 17:07:06 ] >>785 普通にcryptで出来るんですね・・・ありがとうございました。 >>781 >>786 趣味で自宅サーバーをやっているのですが Perlからsystem関数でuseraddを使うためです。 誤解を招く質問をしてしまい申し訳ありません。
788 名前:777 mailto:sage [2009/10/10(土) 03:46:06 ] >786 おっしゃる通り、HTTPレスポンスから取得出来ました。 Perlの質問ではありませんでした…
789 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 01:53:02 ] 自己解決しましたっつーのは自分が苦労して答えを導き出せたから 掲示板に答えが書かれてしまうと自分の苦労の価値が下がってしまうから それを避けるための自慰行為。 「Webリソース」とか書くようなバ力は788なんかじゃなくてwcとかで解決したつもりだろ。
790 名前:デフォルトの名無しさん [2009/10/11(日) 03:25:57 ] >>787 お陰さまで私も勉強になりました。 今時のシステムはパスワード暗号化にsha512使ってるなんて 知りませんでしたから。 うちのシステムは何を使ってるんだろ?
791 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:13:01 ] gzファイルをgzopenを使って読み込みこむことはできたんですが 日本語が文字化けしてしまいます 普通のtxtファイルなどは日本語でも文字化けしません どうしたらいいんでしょうか
792 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:20:33 ] >>791 使うな。
793 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:25:11 ] gzopenを使うなってことですか?
794 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:54:51 ] perlを使うな
795 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 21:03:41 ] perlだとできないんですか? それじゃphpでやってみます・・
796 名前:デフォルトの名無しさん [2009/10/11(日) 23:57:04 ] 連想配列について質問です。 たとえばkeysでとりだしたハッシュの順序は一定ではないそうですが、 何回もperl *.plで実行しても同じ順序でキーが取り出されます。 ハッシュの順序はOS依存なんですか?それともperlのバージョン依存なんですか? 同じ環境のもとで同じプログラムにした場合はkeysでとりだされるキーも同じ順序になるのですか?
797 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:12:59 ] ハッシュ依存じゃないの?
798 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:17:12 ] >一定ではないそうですが これは誰から聞いたの?
799 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:35:34 ] 別に乱数は使ってないよ
800 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:51:45 ] 一定ではないというのは環境によるんだろうが ハッシュに順序の保障を求めるべきではないとは思う 順序の保障が欲しければリストを利用/併用すべきだろうな
801 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:24:16 ] perlのバージョン依存。 perl5.10.0のperldoc -f keysでは、 =========== 超訳。 perl5.8.1までは、セキュリティー上の理由から、 keysはプログラムを実行する度に違う順序で取り出されてた。 (順番自体は見た目上ランダムに決定されてる。ただし、 同一プロセス内で、hashに変更が無いならeach, valuesでも keysと同じ順である事は保証される。) =========== 暗に「より新しいperlではkeysはhashに変更が無いなら プログラムを複数回実行しても同じ順に取り出される。」 と言ってはいるが、それをkeysのperldocでは明文化は してない。 ここまで調べて面倒になった。 俺も>>800 氏と同じ見解だし。
802 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:32:14 ] うそっ わざわざランダムにしてたんだ for (keys っていう処理はするけど、大抵はsortとセットだから気にしたこともなかった
803 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 02:52:49 ] >>801 逆だ。5.8.0までは特定の順序で取り出されていたのを、 5.8.1以降で変わるようにしたんだ。 perldoc.perl.org/functions/keys.html > Since Perl 5.8.1 the ordering is different even between different runs of Perl > for security reasons (see "Algorithmic Complexity Attacks" in perlsec). perldoc.perl.org/perlsec.html#Algorithmic-Complexity-Attacks perldoc.jp/docs/perl/5.10.0/perlsec.pod
804 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 03:59:09 ] セキュリティが理由なら、止めてしまう訳ないしな
805 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 05:43:17 ] 質問です。サブルーチンの途中でreturnせずに戻り値を返すことは可能でしょうか? 長文処理の自作モジュールに引数としてファイル名を渡し、 サブルーチン内でopen、while(各行処理)、closeまで行なっています。 行数が数千行になるので各行で処理を終えたい(@本文のようなリストは作りたくない)のです。 現在サブルーチン内で各行をprintしていますが、どうもスマートではないと思い質問しました。 いまの状態を簡易に書くとこんな感じです。 (呼び出し側) $foo->get('file') (package foo内のサブルーチン) sub get { my $self = shift; my $file = shift; open my $in, "< $file" or die($!); while (<$in>) { #ここで各行を処理してprint } close $in; return 1; } 素直に呼び出し側でファイルを開いて行単位でサブルーチンを呼ぶべきかとも思うのですが、 それもなんかスマートでない気がしてモヤモヤしています。よろしければ方向性だけでも示唆ください。
806 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 06:03:32 ] コルーチン