Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0303nobodyさん
2005/06/10(金) 12:01:26ID:???cgi-lib.pl使った時のデフォじゃね?
ttp://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/free?page=cgi-lib.pl
0304nobodyさん
2005/06/10(金) 12:04:13ID:???0305299
2005/06/10(金) 12:06:16ID:n3jB9OmGページを読みましたが$inはなかったです。
0306299
2005/06/10(金) 12:12:11ID:n3jB9OmGありがとうございます。
早速cgi-lib.plをみてみます。
0307nobodyさん
2005/06/10(金) 12:26:18ID:???0308302
2005/06/10(金) 12:29:51ID:???私もそう思うけど
<input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label>
なら、とりあえず
%labels =('1','<label for="yes1">はい</label>');
$co->radio_group(
-name=>'yes',
-values=>['1','2'],
-labels=>\%labels);
で、いけるんで・・・。
これもむちゃくちゃ使いにくいけど。(・・`)
0309nobodyさん
2005/06/11(土) 01:51:46ID:KxmWI2vs配列の中から文字列を検索して、
その文字列が含まれている配列の添え字を取得することはできますか?
例えば、
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
みたいな配列@dataがあって、そのなかから"72歳"という文字が
含まれている配列の添え字(この場合だと1)を取得したいのですがどうすればよいでしょうか?
0310nobodyさん
2005/06/11(土) 02:23:38ID:???my @data;
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my $str = "72歳";
for ( 0..$#data ) {
if ( $data[$_] =~ /$str/ ) { print; }
}
__END__
0311nobodyさん
2005/06/11(土) 02:46:40ID:???$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my$str = "72歳";
for(0..$#data){
print $_ if [split(/<>/,$data[$_])]->[1] =~ /$str/;
}
0312nobodyさん
2005/06/11(土) 03:03:41ID:???0313nobodyさん
2005/06/11(土) 03:03:43ID:???0314313
2005/06/11(土) 03:05:12ID:???0315312
2005/06/11(土) 03:06:40ID:???オマイので気付いた('A`)
print grep { (split /<>/, $data[$_])[1] =~ m/$str/ } 0 ..$#data;
0316nobodyさん
2005/06/11(土) 09:07:57ID:???変数名を変数で扱うことができますでしょうか?
分かりにくいので例を示しますと、
$TEST = "test";
$OUTPUT = "[[[TEST]]]";
$OUTPUT =~ s/\[\[\[(.*)\]\]\]/$$1/g;
print "$OUTPUT";
↑これで、”test”という出力がほしいのですが…
3行目のコーディングはWindows版のActiveperlでは動くのですがLinux版ではエラーになってしまいます。(もともと、あんなコードで動くことが予想外なんですが。)
よろしくお願いします。
0318nobodyさん
2005/06/11(土) 10:58:39ID:???それであってるはずだがsymbolic referenceを使うことに
なるのでstrict refsな時は問題がでるかもしれん。
というかエラーになるというのならエラーメッセージぐらい
示せよ...
0319nobodyさん
2005/06/11(土) 12:06:49ID:???そのファイルをほしいと言う人がいるので、その人にファイルを与えようと思っています。
しかし、そのファイルを再びダウンロードしてアップロードするとすれば 1 日ぐらいかかってしまいますので、
CGI からそのファイルにリンクしようと思っています。
しかし、 perl 初心者なので、自分が作ったプログラムをサーバ上で実行していいかわかりません。
どうか、以下のプログラムは大丈夫か確認していただけないでしょうか。
#!/usr/bin/perl
&output;
sub output {
open(IN,"(ここにファイルパス)");
print "Content-type: application/x-zip-compressed\n\n";
binmode(IN);
binmode(STDOUT);
print <IN>;
close(IN);
exit;
}
0320nobodyさん
2005/06/11(土) 12:11:42ID:???迷惑だからやめれ。
そのファイルへのリンク貼るか教えるだけでいいじゃん。
0321nobodyさん
2005/06/11(土) 12:16:11ID:???0324質問
2005/06/11(土) 22:30:32ID:95WOJCIX具体的には、Aのなかで、
open(HANDORU,">B.cgi");
print HANDORU << "END";
#!c:\perl\bin\perl
print $data;
END
close(HANDORU);
とした場合、B.cgiはつくられるのですが、
その内容で、\(円マーク)が消えており、、また$dataがなくなってしまいます。
¥を¥にしたらそのまま「¥」にされて書き込まれたりします。
どうしたら、うまく¥や変数が記述されるのでしょうか?
0325質問
2005/06/11(土) 22:36:20ID:95WOJCIX¥を&yen;にしたらそのまま「&yen;」にされて書き込まれたりします。
0326nobodyさん
2005/06/11(土) 23:01:48ID:???ttp://www.rfs.jp/sitebuilder/perl/02/02.html#5.エスケープシーケンス
0328nobodyさん
2005/06/12(日) 00:07:30ID:???if -d $_ && -w _;
って式があるんだけど、これは
if -d $_ && -w $_;
の略、ってことでよいの? つーか 略せるんだったの・・? 見たことなかったんだけど
0329nobodyさん
2005/06/12(日) 01:09:06ID:???perlfunc - Perl builtin functions
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item__i__X__i__FILEHANDLE
>どのファイルテスト (あるいは、stat や lstat) 演算子にも、下線だけから成る特別なファイルハンドルを与えると、
>前回のファイルテスト (や stat) の stat 構造体が使われ、システムコールを省きます
0330nobodyさん
2005/06/12(日) 01:21:50ID:Eqf0BMjVプライベートメソッド内で俗に言うthisを使い処理をする場合、
thisはプライベートメソッドを使用しているメソッドからそのメソッドに引数として渡して処理しなければならないのでしょうか?
どなたかご教授して頂けると嬉しいです。
0332nobodyさん
2005/06/12(日) 03:55:40ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlobj.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlbot.html
http://perl.infoware.ne.jp/documents/perlboot.ja.html
0333330
2005/06/12(日) 20:39:01ID:Eqf0BMjVすみません、一通り見てみたのですが何処に答えがあるか分かりませんでしたorz
見落としていたらごめんなさい。
プライベートメソッドがオブジェクトのリファレンスを取得するには、
やはり実際に呼び出されたメソッドから引数でリファレンスを渡してやらないと行けないのでしょうか?
0334nobodyさん
2005/06/12(日) 20:51:17ID:???なにをさしているかわからない以上はマニュアル嫁的な
一般論以上の回答のしようもないんじゃないかと。
perlの場合オブジェクト指向といっても$foo->f(...)の
形で呼べばfが$fooをblessしたときのパッケージから
探されるのと、自動的に$fooがサブルーチンfの最初の
引数になるぐらいの単純な仕掛けだから難しく考えても
しょうがないと思われる。
0335330
2005/06/12(日) 21:18:28ID:Eqf0BMjV説明下手ですみません。。たぶん、用語等ちゃんと理解できてないんだと思いますorz
プログラムからあるクラスのメソッドを呼び出すとき第一引数にオブジェクトのリファレンスが渡されますよね、
#sub new { $this = shift; ←これ
そのリファレンスをそのクラス内でしか使えない(使わない)メソッド
#sub _cool { ←慣例的に_で始まるサブルーチン名を付けられ、そのクラス内のメソッドから呼び出すので、
#第一引数にはオブジェクトのリファレンスが渡されないメソッド
で使いたいのですが、
#$this->{hoge} ←こんな風に
引数としてリファレンスを渡すしか方法はないのでしょうか(もっと綺麗な方法はないのでしょうか)?
0336330
2005/06/12(日) 21:19:41ID:???0337nobodyさん
2005/06/12(日) 21:25:29ID:???頭に_をつけたなんてのは人間が勝手に目印にしてるだけで
perlは何の特別扱いもしてくれない。頭が_じゃないのと
全く同じ。
0338nobodyさん
2005/06/12(日) 21:33:38ID:???0339nobodyさん
2005/06/12(日) 21:59:12ID:???0342nobodyさん
2005/06/12(日) 23:59:58ID:???0343nobodyさん
2005/06/13(月) 03:11:14ID:???0344nobodyさん
2005/06/13(月) 17:16:05ID:???Jcode.pmのような使い方をするときは、Encodeだけで間に合うと思うのですが。。
0345nobodyさん
2005/06/13(月) 19:18:16ID:???$str =~ s/>/>/g;
$str =~ s/</</g;
とやったら、「小」とか「松」って文字が文字化け
するようになったのだけど、どうやったら対処できそう?
0346nobodyさん
2005/06/13(月) 19:20:38ID:???$str =~ s/>/&gt;/g;
$str =~ s/</&lt;/g;
な感じ。
0347nobodyさん
2005/06/13(月) 19:44:01ID:???Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
0348nobodyさん
2005/06/13(月) 20:04:41ID:???突っ込んで EUC に変換して、
タグを変換して JIS に変換し直すって
ことかな?だりぃな。
0349nobodyさん
2005/06/13(月) 20:17:48ID:???それにブラウザによっては違う文字コード送ってくる場合もあるから、
どちらにしろ文字コードのチェックは必要だ。
0350nobodyさん
2005/06/13(月) 20:24:45ID:???ファイルと出力がJISなんだよ。
頭の柔らかい奴は、JISのタグ変換ぐらい、
もっとスマートな方法でやると思ったんだがな。
0351nobodyさん
2005/06/13(月) 20:27:26ID:???http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
http://search.cpan.org/~dankogai/Encode-2.10/lib/Encode/Supported.pod
0354nobodyさん
2005/06/13(月) 23:29:19ID:???意外と JIS 指定のところが多い
依存性の関係もあるのだろうが
SJIS とか EUC に拘っている奴は
場数が少ない人だと思う
といっても、 JIS に未来はないけどな
0355nobodyさん
2005/06/13(月) 23:37:35ID:???知ってる企業をいくつか検索してもJISで構築されているサイトが見つからない。。。
0356nobodyさん
2005/06/13(月) 23:57:27ID:???おまいが一番拘ってるように見えるがw
つーか、マンドクセだからeuc使ってるだけで。
普通に使う分には一番コスト低いと思うが。eucにデメリットある?
0357nobodyさん
2005/06/14(火) 00:26:50ID:???0358nobodyさん
2005/06/14(火) 00:31:27ID:???EUC-JP と Shift_JIS は誤判定されることが多いけど、
ISO-2022-JP だと割と誤判定されにくい、ってのはあるかも。
0359nobodyさん
2005/06/14(火) 00:38:52ID:???結構ある。 > http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
その点ユニコならこういう問題は起きない。 でもサイズが増えるのがデメリット。
0362nobodyさん
2005/06/14(火) 01:24:46ID:???Apache なら AddCharset しておくのが正しい姿だろうな
0363nobodyさん
2005/06/14(火) 01:34:09ID:???たぶんこれでできるから
foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){
if($str=~/^[^\x1B]/){
$str =~ s/&/&/g;
$str =~ s/</</g;
$str =~ s/>/>/g;
$str =~ s/"/"/g;
}
$out .= $str;
}
0365nobodyさん
2005/06/14(火) 01:36:56ID:???すまん、間違い。
foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){
は
foreach my $str($in =~ /(\x1B.*?\x1B..)|([^\x1B]+)/g){
ね。
0366nobodyさん
2005/06/14(火) 12:33:58ID:TLKadJIJ$text[$ii] = "<tr><td>上の段</td></tr>\n";
$text[$ii] =. "<tr><td>下の段</td></tr>\n";
と書き
$text[$ii]に"<tr><td>上の段</td></tr>\n<tr><td>下の段</td></tr>\n"が格納されるように、
コーディングしたつもりなのですが、エラーが発生してしまいます。
$text[$ii]に"<tr><td>上の段</td></tr>\n"に後から追加で"<tr><td>下の段</td></tr>\n"が、
格納されるようにするにはどのように変えたらよいですか?
0367nobodyさん
2005/06/14(火) 12:38:42ID:???○.=
0368nobodyさん
2005/06/14(火) 12:48:08ID:TLKadJIJ成田 船橋 , 八王子 町田 立川 国分寺 , 所沢 川越 秩父
これを最終的に下のような二次元配列にするために
kanto[0][0] = "成田"
kanto[0][1] = "船橋"
kanto[1][0] = "八王子"
・・・
kanto[1][3] = "秩父"
下のようなプログラム文を書いたのですが、
for $ii (0..$#text) {
@kanto1 = split /,/,$text[$ii];# ←ここはうまくいく
foreach $kk (@kanto1) {
@kanto[$kk][] = split / /,$kanto1[$kk];# ←ここでエラー
}
}
@kanto[$kk][]のところでエラーになってしまいます。
どのようにしたら、うまく@kantoに二次元配列を作成することが出来るでしょうか
0370nobodyさん
2005/06/14(火) 18:03:21ID:???foreach $kk (@kanto1) じゃなくて foreach $kk (0 . $#kanto1) だろ。
0372nobodyさん
2005/06/14(火) 18:28:00ID:???@{$kanto[$kk]} = split / /,$kanto1[$kk];
ありがとうございました!
0374nobodyさん
2005/06/14(火) 19:17:35ID:yq1owU75「Clientから何らかのパケットが届く"たび"に何らかの処理」
を行いたいのですが、recvイベントのようなものはキャッチできないでしょうか。
0375nobodyさん
2005/06/14(火) 19:50:50ID:???@hogehoge[][];
$len = scalar(@hogehoge);
print "要素数= $len ";
この時の$lenに格納されているものは何でしょうか?
$len = scalar(@hogehoge[1]);
最初の[]の要素数を調べるにはどのようにしたら良いのでしょうか?
0376nobodyさん
2005/06/14(火) 20:00:55ID:???単純な質問で申し訳ないのですが
@hogehoge[][];
$len = scalar(@hogehoge);
print "要素数= $len ";
この時の$lenに格納されているものは何でしょうか?
@hogehogeの最初の[]の要素数を調べるには、どのような関数を使ったら良いのでしょうか?
0377nobodyさん
2005/06/14(火) 20:33:05ID:???意味不明
0378nobodyさん
2005/06/14(火) 21:20:23ID:???高次元配列っていうのも、単にリファレンスのネスト、と解釈すれば結構容易に理解できる。
0379nobodyさん
2005/06/15(水) 01:53:31ID:???my $fg = \*TEST;
こんなことをしたとき、
close ($fg); でも
my $fh = *{$fg}{IO};
close ($fh); でも
どっちでもできるんだけど、どっちがいい、とか、どっちかが支障がでる、とかあるのかな?
とりあえず stat (〜) は上で言えば $fg でしかできなかったんだけども。
0380nobodyさん
2005/06/15(水) 03:40:50ID:???引数にグロブ(グロブのリファレンス)を受け取るPerlのネイティブ関数には
ファイルハンドルのリファレンスを渡しても無理だから上の方がいいかと。
ただ、下のは、ブロック内でグロブをローカル化すればシンボルに依存しない
ファイルハンドルのリファレンスが得られる。
でも、シンボルに依存しないファイルハンドルが欲しければ
open ($fh, 'hoge.txt');
てやれば 、無名のグロブリファレンスが得られるから、こっちがいいかもよ。
0381nobodyさん
2005/06/15(水) 09:23:19ID:???それ@niftyだとできないんだよね。。
なので全部eval使ってる。
my $id = "FILE";
eval 'open(' . $id . ', "+>>$path$file")'
〜
eval "seek($id, 0, 2)";
eval "truncate($id, 0);seek($id, 0, 0)";
〜
eval 'print ' . $id . ' $tmp';
〜
eval '@tmp = <' . $id . '>';
〜
eval "close($id)";
0382nobodyさん
2005/06/15(水) 10:05:30ID:???単にstrict refsなだけなんじゃ?
Can't use string ("FILE") as a symbol ref while "strict refs" in use at 〜
ってなエラーじゃない?
わざわざ$idに"FILE"なんて入れないで380の言うように空のまま(=undef)に
しとけば、openするときに無名のリファレンスを入れてもらえるので問題ない
と思うが。
0383nobodyさん
2005/06/15(水) 10:24:44ID:???pfile::open(FILE, writemode)
read(FILE)
write(FILE)
close(FILE)
見たいな感じで、同時に複数開けるように作りました。
あと、@niftyはエラーlogは見れないようになってるらしくて、
内容は分からないんです。。
どっかで配布してた、エラー内容返すcgiも走らないので…
use strict(綴り適当)も、宣言しただけでエラーが出ます。
@niftyは特殊らしい。。でも鯖を選ばず動くscript書きたいので。。
@niftyでエラーメッセージを見る方法ってあるんでしょうか?
誰か使ってる方いましたらご教授お願いします。
0384nobodyさん
2005/06/15(水) 10:41:24ID:???特定環境の話をここで続けていいものかわからんが、@nifty は
プラグマも含めて全てのモジュールが故意に削除されている。
use strict; すると strict.pm が見つからないのでコケる。
別にモジュール「が」使えないわけではないので、必要な
モジュール一式を任意のディレクトリに入れて、スクリプトの
頭で BEGIN { push @INC, '/your/lib/dir' } すれば動く。
0385nobodyさん
2005/06/15(水) 11:03:08ID:???全部消すとは…CGI利用可能にしてるくせに、珍しいですよね。。
@niftyは負荷に対するチェック基準?も厳しいらしく、
自分で作ったfilelockのテストも(n回読み込み→書き込みを繰り返すスクリプトを2つ同時に走らせる)、
nを100回で指定して走らせたら鯖でタイムアウトになりました。
isWebだと300でも軽快に動いたんですが。(それ以上は迷惑になるっぽいので試してません)
確かにちとスレ違いっぽいので以後控えますね。
色々情報ありがとうございました!
0386nobodyさん
2005/06/15(水) 11:21:53ID:pMiUaalZ$file_name = "./text.txt"
open(HANDLE, "$file_name");
ファイルオープンの行の第二引数にダブルクォーテーションがついてるんですが、これは何故なんでしょうか?
これがなくても大丈夫みたいですが。。
0387nobodyさん
2005/06/15(水) 11:31:50ID:???「'」 = 全て文字列として解釈する。
my $a = 10;
print "ねむいよー$a";
→ねむいよー10
print 'かたがいたい$a';
→かたがいたい$a
0388nobodyさん
2005/06/15(水) 11:38:55ID:???引用符の違いではなく、変数だけのときにわざわざ二重引用符をつける意味を聞いているのだが
my $a = 10;
print "$a";
print $a;
0389nobodyさん
2005/06/15(水) 11:44:11ID:EGr0DnSI$pass = '○○○○';
# パスワード確認
if ($in{'pass'} eq "$pass") {
print"パスワードが合ってます";
}
else {
print"パスワードが違います";
}
パスワード認証なら上記でも良いのではないでしょうか?
複雑にする必要性ありそうなのだけど教えてください。
0390nobodyさん
2005/06/15(水) 12:13:11ID:???KENTとかそうやってるね
ソース見られたときにパスワードがモロばれだけどね
普通はDESとかMD5で暗号化する
0391386
2005/06/15(水) 12:38:11ID:???そうなんです。
そっちがわからないんですが・・・。
まあどっちでも動くみたいなんで今のところ気にしないことにしますね^^
失礼しました。
0394389
2005/06/15(水) 13:32:19ID:EGr0DnSI早々有難うございます。
暗号化するというのは、こんな事をするのでしょうか?
my @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
$in{pwd} = crypt($in{pass}, $SALT[int(rand(64))] . $SALT[int(rand(64))]);
0395nobodyさん
2005/06/15(水) 13:56:02ID:???そのままじゃ暗号化されたパスの先頭にキーがついたままだから、substrとかしないと意味ないし、
取ったら取ったで、キーがわからないとどうやってパスワードチェックしたらいいのかわかんねくね?
0396nobodyさん
2005/06/15(水) 14:18:53ID:???>>379だけど、サンクス!参考になった。
今回はシンボルの文字列自体に意味があるので、グロブにさせてもらうよ。
そういや nifty も知らんけど、まだ perl-5.005 以前を使ってる鯖ってあるのかな?
AAA! が 5.005 だったが。 ってスレ違いか。
とにかくなるべく新しいのにして欲しいな。 いろいろ動かなくて困るw
0397nobodyさん
2005/06/15(水) 14:29:05ID:???パスワードの暗号化ってのはパスワードをプレーンテキストで
保管せず、暗号化したデータを保管するってこと。
登録時には下記$pwdをサーバに保存。
$pwd = crypt($input_pwd, $salt);
認証時には保存された$pwdでチェック。
if (crypt($input_pwd, $pwd) eq $pwd) { # 認証OK
0398nobodyさん
2005/06/15(水) 15:20:04ID:???それはわかるけど、 >>395 でさ、>>397で言う $salt を rand させる意味はなくね? って話。
暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、
rand させようがさせまいが、 $pwd を見られたら $salt わかるわけじゃん?
だったら $salt は rand させても、最初から"xy"とかに固定してても、そんなに変わらない気がするのだよ。
0399nobodyさん
2005/06/15(水) 15:24:17ID:???横レスだけど、それってチェック時はなにやってるの?
登録時には下記@indb_pwd($pwd及び$salt)をサーバに保存。
@indb_pwd = (crypt($input_pwd, $salt), $salt);
認証時には保存された$saltを使用して、$pwdでチェック。
if ($indb_pwd[0] eq crypt($in{pwd}, $indbpwd[1])) { # 認証OK
これだったら意味分かるけど…。
0400nobodyさん
2005/06/15(水) 15:25:45ID:???>>397-398
>暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、
知らなかった…
失礼しましたorz
0401nobodyさん
2005/06/15(水) 15:57:46ID:???0402nobodyさん
2005/06/15(水) 16:01:20ID:???0403nobodyさん
2005/06/15(水) 16:08:10ID:???遅レスですが、なんか勘違いしてたかも。
@niftyだと>>379のような、「ファイルハンドルを変数に入れる」ということ自体が出来ないんです。
多分perlのバージョンのせいだと思うんですが。
んでしょうがないので、ハンドルをあらわす文字列自体を動的に扱う為にevalを使ってるという感じです。
$id = "FILE"というのはファイルハンドルを変数に入れようとしているわけではなく、展開してevalに渡すためです。
■ このスレッドは過去ログ倉庫に格納されています