Perlについての質問箱 41箱目at TECH
Perlについての質問箱 41箱目 - 暇つぶし2ch765:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 15:45:51
>>765
配列だから同じキーが何回出てこようとちゃんと
保存されていて問題ないはずだが?

767:765
09/10/08 15:46:38
あと
tie
すると前保持していた値がすべて真っ白になってしまうので
繰り返しのなかに>>764
いれられない状態。
一日なやんでもいい方法が思いつかない

768:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 15:57:32
>>762
やり方が悪いので、データ構造を見直すべし。

770:デフォルトの名無しさん
09/10/08 15:59:54
>>768
そんなのすでに取り出したかハッシュで管理してとばせばいいだけだろ。

771:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 17:35:28
もしかしてこういうのでいいってオチか?

print sort keys %hash;

もしくは

print map $hash{$_}, sort keys %hash;


773:デフォルトの名無しさん
09/10/08 18:44:55
よくわからんが、各層のキーをjoinしたものをハッシュキーにして
Tie::IxHashを使えばいいんじゃないのか。

774:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/08 22:25:23
Webリソースのバイト数を取得するモジュールって何かありますか?

776:デフォルトの名無しさん
09/10/08 23:12:20
>>775
Webリソースって具体的に何だ?

777:デフォルトの名無しさん
09/10/08 23:20:33
>776
タイミングが悪くて非常に申し訳ない。
自己解決しました^^;

ダウンロード対象のつもりでした。html,zip,etc…

778:デフォルトの名無しさん
09/10/08 23:21:56
perlってsocks串刺せますか?

779:デフォルトの名無しさん
09/10/08 23:27:55
uaでいいんじゃないのか?

780:デフォルトの名無しさん
09/10/08 23:28:35
ua…
LWP?とかいうのと関係ありますか?

781:デフォルトの名無しさん
09/10/09 05:57:46
>>774
目的はクラッキング?
フツウの人はシャドウなんていじらないもんな。

782:デフォルトの名無しさん
09/10/09 07:14:21
Pealのデバッガで変数を強制で変えるコマンドってある?

初心者な質問ですまん

783:デフォルトの名無しさん
09/10/09 07:45:58
perlな

784:デフォルトの名無しさん
09/10/09 08:52:12
>>782
普通に代入じゃだめなのん?

785:デフォルトの名無しさん
09/10/09 09:14:52
>>774
そういうシステムならcryptもsha512対応してると思うので
そっち使えばいいと思う。同じライブラリ呼ぶので確実な
筈だよ。

print crypt('password', '$6$salt');

786:デフォルトの名無しさん
09/10/09 14:08:33
>>774
車道クラックか?

>>777
解決したならそれを書くのが筋。HTTPレスポンスのことならHTTPヘッダの
Content-Length: 行で取れるよな。

>>782
スカラ型の内部値を変えたいのか?質問の意図がよくわからん。
数値にしたけりゃ
$foo += 0;
文字列にしたけりゃ
$foo .= '';
内部的にリファレンスとか整数型にしたいとかだったら簡単な方法は知らん。

787:774
09/10/09 17:07:06
>>785
普通にcryptで出来るんですね・・・ありがとうございました。

>>781
>>786
趣味で自宅サーバーをやっているのですが
Perlからsystem関数でuseraddを使うためです。
誤解を招く質問をしてしまい申し訳ありません。

788:777
09/10/10 03:46:06
>786
おっしゃる通り、HTTPレスポンスから取得出来ました。
Perlの質問ではありませんでした…

789:デフォルトの名無しさん
09/10/11 01:53:02
自己解決しましたっつーのは自分が苦労して答えを導き出せたから
掲示板に答えが書かれてしまうと自分の苦労の価値が下がってしまうから
それを避けるための自慰行為。
「Webリソース」とか書くようなバ力は788なんかじゃなくてwcとかで解決したつもりだろ。


790:デフォルトの名無しさん
09/10/11 03:25:57
>>787
お陰さまで私も勉強になりました。
今時のシステムはパスワード暗号化にsha512使ってるなんて
知りませんでしたから。
うちのシステムは何を使ってるんだろ?

791:デフォルトの名無しさん
09/10/11 20:13:01
gzファイルをgzopenを使って読み込みこむことはできたんですが
日本語が文字化けしてしまいます
普通のtxtファイルなどは日本語でも文字化けしません
どうしたらいいんでしょうか

792:デフォルトの名無しさん
09/10/11 20:20:33
>>791
使うな。

793:デフォルトの名無しさん
09/10/11 20:25:11
gzopenを使うなってことですか?

794:デフォルトの名無しさん
09/10/11 20:54:51
perlを使うな

795:デフォルトの名無しさん
09/10/11 21:03:41
perlだとできないんですか?
それじゃphpでやってみます・・

796:デフォルトの名無しさん
09/10/11 23:57:04
連想配列について質問です。
たとえばkeysでとりだしたハッシュの順序は一定ではないそうですが、
何回もperl *.plで実行しても同じ順序でキーが取り出されます。
ハッシュの順序はOS依存なんですか?それともperlのバージョン依存なんですか?
同じ環境のもとで同じプログラムにした場合はkeysでとりだされるキーも同じ順序になるのですか?

797:デフォルトの名無しさん
09/10/12 00:12:59
ハッシュ依存じゃないの?

798:デフォルトの名無しさん
09/10/12 00:17:12
>一定ではないそうですが

これは誰から聞いたの?

799:デフォルトの名無しさん
09/10/12 00:35:34
別に乱数は使ってないよ

800:デフォルトの名無しさん
09/10/12 00:51:45
一定ではないというのは環境によるんだろうが
ハッシュに順序の保障を求めるべきではないとは思う
順序の保障が欲しければリストを利用/併用すべきだろうな

801:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/12 01:32:14
うそっ
わざわざランダムにしてたんだ

for (keys
っていう処理はするけど、大抵はsortとセットだから気にしたこともなかった

803:デフォルトの名無しさん
09/10/12 02:52:49
>>801
逆だ。5.8.0までは特定の順序で取り出されていたのを、
5.8.1以降で変わるようにしたんだ。

URLリンク(perldoc.perl.org)
> Since Perl 5.8.1 the ordering is different even between different runs of Perl
> for security reasons (see "Algorithmic Complexity Attacks" in perlsec).

URLリンク(perldoc.perl.org)
URLリンク(perldoc.jp)

804:デフォルトの名無しさん
09/10/12 03:59:09
セキュリティが理由なら、止めてしまう訳ないしな

805:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/13 06:03:32
コルーチン


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch