Perlコーディング初心 ..
653:642
07/12/17 11:34:49 FgX+pG+l
>>644
37行目は一番最後のprintの部分です。
654:nobodyさん
07/12/18 10:34:57
たとえば、sample.plに、
require('lib/lib.pl');
&dosomething();
と書いておいて、lib/lib.plに、
sub dosomething{
open(FH, '>> baka.log');
print FH time."\n";
close(FH);
}
とすると、lib/の中にファイルができるのではなく、ひとつ上にできてしまいます。
これをlib/の中に保存したいのですが、ライブラリからの相対パスで保存する方法はないでしょうか。
または絶対パスを使うしかないのでしょうか。
ヒントだけでもお願いします。
655:nobodyさん
07/12/18 11:18:35
>>654
じゃあ、ヒントだけ…
つ %INC
656:654
07/12/18 16:52:48
>>655
ありがとう!
こーゆー用途に使うのな。
657:nobodyさん
07/12/19 01:05:36
ハッシュ配列の各要素をリファレンスとして関数の引数に渡したいのですが
よくわからなくて試行錯誤の末下のような方法にたどり着きました
$AA{'name'} = '1234';
$BB[0]{'name'} = 'abc';
$BB[1]{'name'} = 'ああああ';
$BB[2]{'name'} = '!?';
kansuu( \%AA );
$tmp = \@BB;
kansuu( ${\$tmp->[0]} );
kansuu( ${\$tmp->[1]} );
kansuu( ${\$tmp->[2]} );
sub kansuu
{
my $h = $_[0];
print "$h->{'name'}<br>";
}
BBの要素を kansuu() に入れるために
もっとスマートな方法(っていうか正しい書式)がありましたら教えていただけないでしょうか?
658:nobodyさん
07/12/19 01:14:31
my %AA = ( name => 1234 );
my @BB = (
{name => 'abc'}, #$BB[0]に無名ハッシュ(リファレンス)をいれる
{name => 'ああああ'}, #$BB[1]に〃
{name => '!?'} #$BB[2]に〃
);
kansuu( \%AA ); #\をつけることで%AAのリファレンスがわたる
kansuu( $bb[0] ); #$bb[0]の無名ハッシュリファレンスを渡す
kansuu( $bb[1] );
kansuu( $bb[2] );
sub kansuu {
printf('%s<br>',shift->{name});#ハッシュリファレンスは->をつけて要素を取り出す
}
659:nobodyさん
07/12/19 02:00:39
$,@,%,\と(),{},[]と->の組み合わせで大抵何とかなる。
正直スカラーのリファレンスの説明は自身がないけどおよそあってると思う
my $scalar = 'abc'; #スカラー
my $scalar_ref = \$scalar; #スカラーのリファレンス
my $anon_scalar_ref = \do {my $anon;}; #微妙に無名じゃないけど
my @array = (1,2,3); #配列
my $array_ref = \@array; #配列のリファレンス
my $anon_array_ref = [1,2,3]; #無名配列のリファレンス
my %hash = (a=>1,b=>2,c=>3); #ハッシュ
my $hash_ref = \%hash; #ハッシュのリファレンス
my $anon_hash_ref = {a=>1,b=>2,c=>3}; #無名ハッシュのリファレンス
my $slacar_object = bless $scalar_ref => __PACKAGE__; # スカラー使ったオブジェクト
my $array_object = bless $array_ref => __PACKAGE__; # 配列使ったオブジェクト
my $hash_object = bless $hash_ref => __PACKAGE__; # ハッシュ使ったオブジェクト
#素直に取り出せる
printf "scalar=%s\n",$scalar;
printf "array=%s\n",$array[0];
printf "scalar=%s\n",$hash{a};
#アドレスっぽいのがとれる
printf "scalar_ref=%s\n",$scalar_ref;
printf "array_ref=%s\n",$array_ref;
printf "scalar_ref=%s\n",$hash_ref;
#リファレンス先の値書き換えたり取り出したり
$$scalar_ref = '書き換えちゃった';printf "scalar=%s\n",$$scalar_ref;
$array_ref->[1] = '書き換えちゃった';printf "array=%s\n",$array_ref->[1];
$hash_ref->{b} = '書き換えちゃった';printf "scalar=%s\n",$hash_ref->{b};
#デリファレンスする(copyが作られる)
my $scalar2 = ${$scalar_ref};
my @array2 = @{$array_ref};
my %hash2 = %{$hash_ref};
660:nobodyさん
07/12/19 07:53:49
CGI.pmでmetaを出力したいのですがうまくいきません。
↓これを出力したいのですが・・・
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
URLリンク(www.geocities.co.jp)
このページの解説によると、
use CGI;
my $q = CGI->new;
print $q->start_html(
-head=>meta({'http-equiv' => 'Content-Type'
-content=>"text/html; charset=$CharSet"}
),
このようなコードになるはずなのですが、やってみると
Undefined subroutine &main::meta called
というエラーがでます。meta()がメインのサブルーチンだと解釈されてるみたいです。
661:660 続き
07/12/19 07:54:19
print $q->start_html(
-head=>$q->meta({'http-equiv' => 'Content-Type'
-content=>"text/html; charset=$CharSet"}
),
とやると一応うまくいくのですが、なぜか
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
このようにもう一つ余計なメタが出てしまいます。どうすればいいのでしょうか?
CGI.pmは3..31です。
662:nobodyさん
07/12/19 10:23:45
>>660-661
URLリンク(perldoc.jp)
my $q = CGI->new;
$q->charset('UTF-8');
663:660
07/12/19 23:37:11
>>662
ありがとうございました!
664:657
07/12/20 08:31:41
>>658-659
ありがとうございます!
超わかりやすくて助かりました
今のプログラムの色んなところがもっと簡潔に書けそうです
665:nobodyさん
07/12/20 10:28:40
> 超わかりやすくて助かりました
> 今のプログラムの色んなところがもっと簡潔に書けそうです
本当はわかってないくせに。
666:nobodyさん
07/12/20 13:33:18
>>658-659ですべてが理解できれば天才
667:nobodyさん
07/12/20 13:39:25
最低限は書かれてて分かりやすいとは思ったぞ
668:nobodyさん
07/12/20 16:21:00
読む気もしねぇよ
669:nobodyさん
07/12/21 21:13:42
でもああやって思いつく限りの書き方試して要素やハッシュ値見てればなんとなくでもわかってくるはず。
めんどいけど。
670:nobodyさん
07/12/22 18:50:11
あんな変な列挙を眺めるんじゃなくて、続初めてのPerl読むべきだろ。
671:nobodyさん
08/01/02 06:47:19
perl5.10 に移行した人います?
672:nobodyさん
08/01/02 20:07:21
ノ
依存コードは書いてないけど
673:nobodyさん
08/01/03 00:16:04
ノシ
cygwinで5.10入れてみた
use 5.10;で書いてみてる
674:nobodyさん
08/01/05 22:21:41
変数の中身を展開せずに確認したい場合ってどうすればいいんでしょうか?
$test = "今日は\n いい天気です $wether";
こんな変数があるとして、$test自体は展開してほしいんですが、
中身の\nや$wetherは展開せずに出力したいのです。
675:nobodyさん
08/01/05 22:58:36
'
ちなみに、weather?
676:nobodyさん
08/01/06 03:58:05
>>674
$testに代入した時点で展開しちゃってるでそ
そもそも確認したい意図は何?
リファレンスにしてアドレスを確認する手もあるけど
677:674
08/01/06 14:08:20
うーん、無理みたいですね。諦めます。一応問題は解決しましたので
>>675
そうです;
>>676
なるほど・・・
意図は正規表現でゴチャゴチャいじったあとの文字列が
どうしてもめちゃくちゃくになってしまうので、変数の位置関係を調べたかったのです。
678:nobodyさん
08/01/06 16:36:10
>>674はなぜ>>675の一行目を無視するんだ?
それが答えじゃないか。
>>676はそれもわかってないみたいだが。
679:nobodyさん
08/01/06 23:12:25 wcb81UNa
$kekka = int(200 * 0.29);
print "$kekka";
このような計算をしたら、結果が57になりました。
intって小数点が発生した時に切り落とすはずですよね?
えと、なぜこんなことになるのか意味が分からないのですが、
誰かご教授お願いします
680:nobodyさん
08/01/07 01:59:09
>>679
URLリンク(www.tt.rim.or.jp)
681:nobodyさん
08/01/07 11:17:24
それ、今じゃ間違いじゃないってのが一般的。
語源の知識としてはありだけど、誤用が定着するなんていくらでもあることだから。
いつもいつも空気読めない人が指摘するよな。
682:nobodyさん
08/01/07 11:27:36
>>679
$kekka = int(((my $n=200 * 0.29)=~/(.*)/)[0]);
print "$kekka";
こう書けばOK
683:nobodyさん
08/01/07 11:29:04
>>681
誤用でない方が一般的だとする根拠は?
684:nobodyさん
08/01/07 11:38:36
回答にはなってないけれど、こちらの環境でもいくつか試してみた
ので、その結果を書いておく。
何でこんな風な結果になるのだろうか。私も分からなかった。
$kekka = 200 * 0.29;
print "$kekka";
出力:58
$kekka = 200 * 0.29;
$kekka = int($kekka);
print "$kekka";
出力:57
$kekka = int(200 * 0.29);
print "$kekka";
出力:57
$kekka = int(2 * 29);
print "$kekka";
出力:58
685:nobodyさん
08/01/07 12:30:31
浮動少数の扱いの問題。
use bignum; これで解決。
686:nobodyさん
08/01/07 21:15:48 XSyaqzwg
>>685
おぉ いきました!
詳しい原因はよくわからないですが、ありがとうございました。
687:nobodyさん
08/01/07 21:22:49
ためしにPerlじゃなくてLispで
(* 200 0.29)
ってしてみたら57.99999999999999だってさ。機械の計算って難しいことがあるな
688:nobodyさん
08/01/07 22:41:02
誤差については、がっこで習うものだと思ってたけど、そうでもない?
689:nobodyさん
08/01/07 22:44:33
俺は習ったけど、もしかしたら教えてないところも少なくないかもしれん
690:nobodyさん
08/01/07 23:59:36
情報工学を扱う授業でもなきゃ教わらないんじゃね?
少なくとも俺は浮動小数点の丸め誤差については習ったことない。
あと高校の世界史も。
691:nobodyさん
08/01/08 00:07:25
>>683
>>681じゃないがなんかの辞書に載ってた気がする
ソースはない
692:nobodyさん
08/01/08 00:31:05 k+nta2fc
丸め誤差の知識はありますけど、
コンピュータの中で200*0.29ってどうやって計算してるか分からない
そもそも結果が57.9999・・・・になると言われても、どういう計算をしているのか
さっぱりw
693:nobodyさん
08/01/08 00:34:28
しかも
(* 20 0.29)
これは5.8って表示されるから困るw
694:nobodyさん
08/01/08 00:38:53
自前のショッピングカートの消費税を int($sum * 0.05) みたいに計算してるんだけど、大丈夫だろうか…
695:nobodyさん
08/01/08 07:14:24
>>694
>>685にすれば大丈夫かと
696:nobodyさん
08/01/08 08:15:35
俺は一番最初の質問者ではないが、浮動小数点の丸め誤差については、
wikipediaにも載ってたね。
問題の解決には、 use bignum; つかえばいいわけで、それでいい
のは分かるけれど、それとは別の話で、小数を100倍して整数で演算をして、
あとで100で割ったりする方法だったらちゃんとでるから
use bignum; しなくてもいいんだよね?
697:nobodyさん
08/01/08 22:01:08
>>696
0.29が有効数字2桁だとあらかじめ分かっているなら100倍すればいいけどなあ。
既知でないときにはuse bignum;じゃないか?
698:nobodyさん
08/01/09 00:10:32
>>697
レスサンクス。
いや、意味の無い部分の考えかなと思ったんだけど、
そっちの方がメモリが少なくて済み、処理が早くなったりするのかなとか
思ったのよね。ま、すごく小さな世界をいっているんだろうけれど。
699:nobodyさん
08/01/09 01:01:57
うーん、俺も難しいことはわからんけど、
俺は細かい実行時間を気にしてミスをするより、コードの可読性を優先したいな。と思った。
大量のデータを扱う人から見ればふざけた態度かもしれないけどね。
700:nobodyさん
08/01/09 02:01:45
LL的には人間にとっての最適化(コードの可読性)のほうが重要だからそれでいいと思うな
701:nobodyさん
08/01/09 03:08:01 480klIK2
リーダビリティ重要。(高橋メソッド風に)
702:nobodyさん
08/01/10 23:51:33
IPを10進数に変換したものと、
サブネットマスク形式のリストをマッチングさせたいんですが、
どんなループさせればいいですかね?
#判定ルーチン内
foreach (@list) {
my ($min,$max) = subnetMinMax($_);
return ($ip >= $min and $ip <= $max) ? 1 : 0;
}
としてるんですが、grep等を使ったほうが良いんでしょうか?
ループ内でサブルーチン呼ぶのがちょっと気になります。
703:nobodyさん
08/01/11 00:04:09
訂正orz
x: return ($ip >= $min and $ip <= $max) ? 1 : 0;
o: return 1 if($ip >= $min and $ip <= $max);
704:nobodyさん
08/01/11 11:44:26
@listの中にマッチするものが複数存在する可能性があって
何にマッチしたか全て取りたいならgrepだけど
有るか無いかだけでいいならループ回して見つけ次第結果返していいんじゃない?
705:nobodyさん
08/01/11 16:30:20
return $ip >= $min and $ip <= $max;
706:nobodyさん
08/01/11 20:31:41
>>704
なるほど。このままにしますありがとうございました。
>>705
そっか、そうですよね。
聞いてみて良かったです。
707:nobodyさん
08/01/12 13:10:11
「うんこ」を含む行の最後に「出る」と追加することってできますか?
「うんこ」の前後は英数字・日本語交じりで文字数は不定です。
$_ =~ s/(うんこ)/$1でる/;
だと、うんこ〜出るの間の文字が文末にきてしまいます。
文末指定は$みたいなので
$_ =~ s/(うんこ)/$1でる$/;
としてperlを実行させると、エラーなのか、プログラムが終わりません。
708:nobodyさん
08/01/12 13:13:01
if ( $うんこ =~ /うんこ/ ) {
$うんこ .= ’でる’
}
709:nobodyさん
08/01/12 13:38:43
「うんこを含む行」「改行」 ⇒ 「うんこを含む行」「でる」「改行」
if (index($_, 'うんこ') >= 0){ $_=~ s/$/でる/; }
710:707
08/01/12 13:54:47
>>708
全角を半角にしてやってみたりしましたが、エラーでした。
>>709
できました。ありがとうございます。
ただ、>=0の意味が分かりません。
改行は\nじゃないんですか?
711:nobodyさん
08/01/12 18:35:26
なにこのうんこスレ
712:nobodyさん
08/01/12 19:18:44
>>710
index
713:707
08/01/12 22:50:20
>>712
すみません、わかりました。ありがとうございました。
714:nobodyさん
08/01/13 13:16:41 rzzkvCmj
怠惰が美徳だの
エロエロ言語だの
言うけどさ
俺が習ってきた主な4つの言語のなかじゃ
間違いなく一番習得が苦しかった
ぞ
つまり、学習コストは高い
Perlより習得が難しい言語ってあるの?
私見では達人レベルを目指すならC++が全言語のなかで一番習得困難
そこそこのプロレベルを目指すならPerlが一番困難(C++はそこそこのプロならまだ簡単)
715:nobodyさん
08/01/13 13:17:19 rzzkvCmj
スレ間違えた( ゚д゚ )
716:nobodyさん
08/01/13 21:52:12
配布用のスクリプトを書く予定なんですが、
変数名のつけ方で悩んでいます。
たとえば、
my $title;
my $script_content_title;
my $ScriptContentTitle;
sub param{}
sub parse_URL_encoded_string{}
sub ParseURLEncodedString{}
等、色々書き方ありますが
短い方が良いのか、わかりやすい名前が良いのか、
又、大文字、小文字を混ぜて使うべきか、覚えやすい名前にするべきか、
意見ください。
賛否両論あると思いますが、極力万人受けするものを選びたいです。
長文すみません
717:nobodyさん
08/01/13 21:53:50
配布スクリプトの中身の変数名なんて誰も見ねぇよ
718:nobodyさん
08/01/13 21:56:06
>>717
学習、改造用として配布したいんです。
719:nobodyさん
08/01/13 22:43:42
perldoc perlstyle
720:nobodyさん
08/01/13 23:03:26
変数や関数の名前の付け方は、どんなプログラムを書こうとしている
かというところもあるからな。
例えば、関数名で html_ をつけるとそうでないものとの区別がついて
分かりやすくなるけれど、全部の関数に html_ がついてたら
逆に無意味に長いだけとなる。
ここでアドバイスが欲しかったら、その書こうとしているプログラムや
ソースをもう少し具体的にだすとかしないと話は進まないと思う。
721:716
08/01/13 23:22:17
>>719
ありがとうございます。全部読みました。
基本的にはアンダースコアを使うべきだそうです。
スコープによって使い分けるのが良いみたいですね。
$Global_Data #グローバル
$tmp #局所
$LOCK_KIND #定数
>>720
プログラムの種類によって書き方が変わる、変えられるのがperlの利点かもしれませんね。
>全部の関数にhtml_
そういうのはパッケージにまとめればOKですかね。
おかげ様で書き方が頭に浮かんできました。ありがとうございました。
722:nobodyさん
08/01/14 02:09:11
Perlプログラマは"不精"なので面倒なタイピングはしません。
でもPerlプログラマは"傲慢"なので他人のコーディングスタイルを気にしません。
こんなイメージ。
723:nobodyさん
08/01/14 02:26:48
怠惰と傲慢と短気だっけなラリーの三原則。
ネーミング重要。(高橋メソッド風に)
でも職人芸的なところあるよねネーミングセンスって。
なかなかそこは難しい。
724:nobodyさん
08/01/14 04:10:53
果たして自閉症の描くイメージとは
725:nobodyさん
08/01/14 04:15:16
>>716
もう解決したみたいだけど、Perlベストプラクティスもおすすめ
ダミアン先生の盲信はいけないけど、かなりためになるYo
726:nobodyさん
08/01/14 17:41:01
ダミアン先生はPerl界屈指のハッカーだが、著作物での記述にクセが全くないわけではないからね。
一般論としては、上を目指すならいろんなハッカーのコードや文章にたくさん触れることが必要。
これがなかなか大変だし難しい。
そのためにはネット上のコミュニティーやリアルのイベントにこまめに参加したり
ブログを定期的にチェックし続けないといけないから。
そういうことをしてない自称Perl使いが結構俺の周りにはいて、
そういう奴らは我流のあまりエレガントじゃないスタイルから抜け出せないでいる。
727:nobodyさん
08/01/14 18:57:12 4AKnbZN2
ファイルに入っている文字を出力するつもりなのですが、
メタ字が混ざっていることもあり、ちゃんと出力できません。
あらかじめファイルの中のメタ字に\を振って置くとしても、かなりの手間になりそうですし、
何か効率の良いメタ字対策はないでしょうか?
728:727
08/01/14 19:02:23 4AKnbZN2
すみません。微妙に文書が狂っていました。
ファイルに入っている文字からの出力の際の
文字化けする文字の対策をお願いします。
729:716
08/01/14 20:00:43
>>725-726
オライリーファンの俺には最高の本かもです。
>>727-728
余計な事してるからじゃないですかね?
quotemetaなんてのはどうですか?
文字コードなんかも書くと返事もらえるかも。
730:nobodyさん
08/01/14 20:08:53
>>727
情報不足です。
「ファイルに入っている文字」…どんな文字? 文字コードは何?
「出力するつもり」…どこに出力するの?
「メタ字」…具体的にどの文字ですか?
「ちゃんと出力できません」…具体的にどのように出力できないのですか?
ありがちなのは、ファイルの中と、コンソールの文字コードの設定が異なっていて、文字化けしたように見えるとか。
メタ文字をいったん解釈してしまっているとか。
ヌル文字とかタブとか垂直タブとかグループセパレータとかasciiの制御コードはそもそも「文字」ではないですし。
「文字」をどう「出力」したいのかにもよります。
コードを示してはどうですか。
731:727
08/01/14 20:18:57 4AKnbZN2
$i = 0;
while($list = <IN>){
(undef,$name[$i],undef) = split(/:/, $list);
$i++;
}
@name = sort(@name);
while($line = <@name>){
print "<option value='$line'>$line</option>";
}
えーっと、コードはこのような感じです。
ファイルのDBにアクセスして、その中の一部を取り出しソートしてhtmlで出力するという形です。
732:nobodyさん
08/01/14 20:21:10
メタ文字がhtmlの解釈の問題を引き起こしてるんじゃないよね?
733:nobodyさん
08/01/14 20:23:30
metaタグで宣言している文字コードと異なるとか…
html中で使われてる文字コードと出力してる変数の文字コードの不一致とか…
734:727
08/01/14 20:30:22
>>733
タグで宣言しているコードは関係ないのではと思います。
出力するとき、一部の文字がうまく表示出来ていませんから。
735:727
08/01/14 20:32:56
現状としてはファイルの中の「ソ」とかに\を付けていけば表示はうまくいくのですが、
ファイルをその後書き換えたりするとそれも出来なくなるのではないかと思っております。
736:nobodyさん
08/01/14 20:40:00
これか?URLリンク(www.kentweb.jp)
737:nobodyさん
08/01/14 20:46:05
>>735
use utf8;
binmode STDIN, ':encoding(shiftjis)';
binmode STDOUT, ':encoding(shiftjis)';
# windowsなら shiftjis -> cp932
↑やってみて
ソース中に日本語文字列書くならutf8で保存してね。
738:nobodyさん
08/01/14 20:54:55
あw
binmode IN, ':encoding(shiftjis)';
かな?
739:nobodyさん
08/01/14 20:57:33
>>731
DBにアクセスしているのにファイルハンドルから@nameに格納しているとはいかに?
@nameへの格納の仕方が心許ないです。せめて以下のようにするとか。
my @name = map { (split(/:/))[1] } <IN>;
splitの対象が全角のコロンですが、perlソースと取り扱うデータの文字コードが合っていないと
間違いの元ですよ。
で、optionタグで書き出すべき文字列のリストが@nameに入っていて、それをどうしてグロブ
演算子を使っているのかわかりません。私はこんなこと一度もしたことありませんが…。
ここで、@nameの各要素がいったん解釈されてしまっていて、カタカナのソなどSJISの2バイト目の
\x5cが取り除かれてしまっています。単に
for (sort @name) {
print qq{<option value="$_">$_</option>\n};
}
でいいと思うのですが。
740:nobodyさん
08/01/16 00:34:21
CGI::Applicationで index.cgi?rm=<デタラメなキー> のように
run_modesで定義されなかったrun_modeを指定するとエラーが発生させられてしまうのですが
未定義の場合デフォルトのrunmodeを起動させる方法は無いでしょうか?
741:nobodyさん
08/01/16 02:08:57
$self->run_modes(
AUTOLOAD => \&catch_my_exception,
);
742:nobodyさん
08/01/16 02:17:14
>>741
ありがとうございます!試してみます。
743:nobodyさん
08/01/16 04:59:20 FWbaTTLj
5.005です。
以下のような、引数が省略可能なサブルーチンがあるとします。
sub Func(;$\@\%) { (省略) }
このとき、引数が渡されたのか、それとも省略されたのかを
Func内で判断する方法を教えてください。
なお、そのままifに入れると偽となるような値(例えばスカラーの値が0)の場合も、
引数が渡されていると判断します。
744:nobodyさん
08/01/16 05:29:59
>>743
引数の数から判定
sub Func(;$\@\%) { print scalar @_ }
Func(); # 0
Func(undef); # 1
Func(1, @hoge); # 2
745:nobodyさん
08/01/16 05:44:10
>744
ありがとうございます。
なるほど、サブルーチンを使う時は常に@_を意識しないとダメだってことですね。
746:nobodyさん
08/01/16 11:29:46
@_ ってカタツムリみたいだよね。
@_ii
747:nobodyさん
08/01/16 14:19:16 Z4nycbhz
かたつむり大作戦
748:nobodyさん
08/01/16 20:06:54 L/Qn1HzA
質問です!
入門書を見ながら「URLにパラメータを加える」というのをやりました。
〜〜/test.cgi?list=man
とURLにパラメーターをくっつけ、cgiで
&ReadParse( *form );
$sex = $form{ 'list' };
と受け取ったつもりだったのですが、結果をprintしてみると
manman
と2回表示されてしまいます。これは何が悪いのでしょうか?
749:nobodyさん
08/01/16 20:30:55
いるんだよ、自分で勝手に照会用のコードを切り詰める奴
750:748
08/01/16 20:51:36
失礼しました。手当たりしだい試してたら解決しました。
なんだか色々と間違ってたようです。
751:nobodyさん
08/01/16 22:40:40 QOevDgBW
CGIモジュール等を使わない、
一般的なuriデコードのバグってどんな事ですか?
同じkeyに複数のvalがある場合の対処はしてます。
752:nobodyさん
08/01/17 00:41:41
>>751
区切り文字が & でなく ; のときとか、マルチタイプで送られてきたときとか、XSS対策とかかな?
753:nobodyさん
08/01/17 12:39:49
ちょっと考えてみてほしい
ドラゴンボールというのは、集めれば願いがかなうアイテムだ
それに対して、
ウンコは、いくらドッサリ集めてもウンコにしかならない
このように両者は一見似ているようで本質的に異なる
754:nobodyさん
08/01/17 12:41:44
>>751
巨大なクエリーとか、lengthがでたらめとかかな?
# httpdの仕様にもよるな
755:nobodyさん
08/01/17 17:15:28
uriデコード?とは関係ないけど
CGI.pm使うとmod_perl環境(Apache::RegistryやModPerl::Registry)で
-ParseHeadersやPerlSendHeader offしてあってもheaderを正しく扱えるので
CGIでもmod_perlでも動きます。ってプログラムが作りやすくなる。
756:nobodyさん
08/01/17 17:17:24
>>751
バグってどういうこと?
引数には、ある程度想定されるものしか入らないはずなんだから、
$form{'hoge'} とか、引数として使う値に想定される正しい値が入っているかのチェックを行えばいいんじゃないの?
757:751
08/01/17 18:58:22
>>752
区切り文字はCGI.pmでも&か:ですよね。
>>754
cgi側では解決できないような感じしますね。
>>755
それは良いコト聞いた。
>>756
オライリーの本読んでたら一般的にバグがあるとの事です。
CGI..pm使えとの一点張りです。
なので、どこにバグがあるのかなと ← いまここ
みなさんレスありがとうございます。
758:nobodyさん
08/01/17 23:23:09
とりあえず>>751がド初心者だということは分かった。
759:nobodyさん
08/01/18 00:48:01
>>758
スレタイ読めカス
760:nobodyさん
08/01/18 12:04:46 Z4Jr4bli
ファイルをサーバにアップロードしたいCGIがほしいのですが
どこかいいサンプルないでしょうか?
アップロードしたいファイルはエクセルファイルです
761:nobodyさん
08/01/18 12:15:45
ぐぐれかす
762:nobodyさん
08/01/18 12:39:13
アップロードされたファイルのを受信するCGIなのか、
それともファイルをアップロードするCGIなのか知らんけど
URLリンク(search.cpan.org)
URLリンク(search.cpan.org)
763:nobodyさん
08/01/18 12:51:11
>>760
ちゃんとした日本語で
764:nobodyさん
08/01/18 14:27:48
アップロードしたがってるCGIが欲しいんだろ
765:nobodyさん
08/01/18 15:13:46
意思を持つCGIコワス
766:nobodyさん
08/01/18 16:38:38
>>760 こんな感じですか?
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use CGI qw/:standard/;
use constant MAX_WAIT => 10;
my $q = new CGI;
$q->charset('utf8');
my $wait = rand(MAX_WAIT);
my @mind = qw(uploadしたい uploadしたくない uploadしてもいい);
my $mind = $mind[ int( rand(scalar @mind) ) ];
print start_html(
-head => meta({-http_equiv=>'refresh', -content=>"10; URL=$ENV{SCRIPT_NAME}"}),
-title => 'CGIの気持ち'
),$mind,end_html;
767:nobodyさん
08/01/19 01:06:12
>>766
$waitは、どこで使ってるの?
-head => meta({-http_equiv=>'refresh', -content=>"$wait; URL=$ENV{SCRIPT_NAME}"}),
とかやりたかったのか?
768:nobodyさん
08/01/19 14:38:24 gMv3rNuv
すみません、少し数学の話になるかもしれませんが、
100%の確率のうち30%が当たりという設定をして
くじを引かせる場合、
my $rate = 30;
my $atari = int((rand(100))) + 1;
if($atari <= $rate){
print "あたり\n";
}
これで30%ということに理屈ではいえるのでしょうか。
それとも上か下かなので2分の1になるのでしょうか。
ご教示いただけますと幸いです。
769:nobodyさん
08/01/19 15:04:56
算数のレベルだぞ
770:nobodyさん
08/01/19 15:25:31
すみません
771:nobodyさん
08/01/19 16:00:15
>>768
そういうときは、そのコードを何万回か繰り返してあたりとはずれのカウントを取って、
実際に30%くらいになるかを調べればいいんですよ。
772:nobodyさん
08/01/19 17:54:09
>>768
極東連合乙
773:nobodyさん
08/01/19 18:03:47
>>768
10000回だけ繰り返してみた。
あたり=3031
はずれ=6969
774:nobodyさん
08/01/19 21:24:36
>>771
ありがとうございます。
>>773
実行有難うございます。
私の方でもやってみましたが、平均値が30%になりました。
安心しました。
775:nobodyさん
08/01/19 23:16:40
#!/usr/bin/env perl
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(strftime);
my $q = new CGI;
print $q->header(), $q->start_html();
#print $q->dump; # for debug
my $outputdir = "log"; # ファイルを置く先 (ディレクトリ)
my $fh = $q->param('uploaded_file');
my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子
if ($fh ne "") {
my $timestamp = strftime "%y%m%d%H%M%S", localtime;
my $outputfn = "$outputdir/$timestamp$ex";
open(F, "> $outputfn") or die;
flock(F, 2);
if (defined $fh) {
while (<$fh>) {
print F $_;
}
}
close F;
print qq{saved as <a href="$outputfn">$outputfn</a>};
}
print $q->start_multipart_form(-name => 'myform'),
$q->filefield(-name => 'uploaded_file'),
$q->submit("OK"),
$q->endform,
$q->end_html(), "\n";
776:760
08/01/19 23:18:40
ファイルをアップロードするCGIを探してます。
日本語おかしかったですね、すいません。
サンプルを探したんですが
>>775のままだったら
ファイルをアップしたときにファイル名が
アップロードした日付になってしまいます。
ファイル名を変更することなくアップロードするにはどうすればいいでしょうか?
777:nobodyさん
08/01/20 00:14:39 1RDcSYMg
my $outputfn = "$outputdir/$timestamp$ex";
のところを、そうじゃなくすれば良い。
778:nobodyさん
08/01/20 00:15:00
>>776
マルチタイプを分割して、そのヘッダ部分に名前あるよ。
779:nobodyさん
08/01/20 02:12:08
ついでにフォルダ名も表示してやれば、閑古鳥鳴くこと間違い無し。
780:nobodyさん
08/01/20 03:03:09
サーバにファイル名を任意に保存出来るって危険じゃね?
同名ファイルの処理が必要になるし、文字化けとかあるし。
文字化けとかしたら、ダウソとか出来なくなる場合もあるし、
削除とかはsshログインして * とか使って消さないといけなく
なる場合もある。(解決は出来るから問題なしともいえるのだが)
日本語はファイルと一緒にコメントとして管理すべきだと思うけど、
どうかな?
781:nobodyさん
08/01/20 10:25:46
>>780
間違いなく正しい。
782:nobodyさん
08/01/20 19:19:48 xw354eHR
上の人とは別人だけどファイルのアップロードに関して質問
open(OUT, ">$filename");
binmode(OUT);
while (read($fh, $buf, 1024)) { print OUT $buf; }
close(OUT);
close($fh);
上記なソースをよく見かけるんだけど、
三行目で一気に処理するんじゃなくて、
1024バイトずつ取り出して処理する理由って何?
783:nobodyさん
08/01/20 19:21:07
1000MBのバッファ蓄えろというのか
784:775
08/01/20 19:37:21
>>777
具体的にどうかえればいいのでしょうか?
教えてくださいとはいいません。
やってください
>>780
ご意見ありがとうございます。
785:nobodyさん
08/01/20 20:21:40
完全に自分専用とかなら別なんだろうけどな。
786:nobodyさん
08/01/20 22:56:33
>782-783 に関連した便乗質問で悪いけど、
レン鯖とかも考えた時の常識的なメモリ使用量ってどのくらい?
シュワルツ変換とか使っていいものかいつも悩む。
787:nobodyさん
08/01/20 23:26:35
>>786
「レンタルサーバ メモリ使用量」でぐぐってみたらどうかな?
ま、突き詰めるとそのサービスの仕様次第となるだろう。
シュワルツ変換も「やってはいけない処理」ではなく、重たい処理
でしかないからな。それだけの質問では何もいえない。
具体的なソースを出して、この負荷は問題ないか?とかなら分かるが。
788:nobodyさん
08/01/21 21:15:32 29cYlZ80
input type=file で送るファイルを指定しますが、
この場合のファイル名そのものを取得するようにするには
どのようにしたらよいですか?
789:nobodyさん
08/01/21 21:26:25
>>788
HTTP_CONTENT_TYPEを見て、boundaryで区切って分割して、そのヘッダを読む。
790:nobodyさん
08/01/21 22:20:09 29cYlZ80
>>789
有り難うございます
よく分かりませんが、ヒントを元にくぐってみます
791:nobodyさん
08/01/21 22:33:12 MggCWroJ
toolkitについての質問です。
toolkitのテンプレートを利用ユーザに編集させてたいと思っているのですが、
[% myheader = 'my/index.cgi' %]
[% INCLUDE myheader %]
などされるとソースが見えてしまいます。
なんとか規制できないでしょうか?
phpのsmartyであれば以下のように、テンプレートからのインクルードを規制することができます。
同等の機能はあるのでしょうか?
$this->security = true;
$this->security_settings["INCCLUDE_ANY"] = false;
$this->security_dir = "/path/to/templates";
$this->trustes_dir = "/path/to/php";
または、テンプレート内で使える関数を指定できるとかありますでしょうか?
日本語マニュアル見てみましたが、それらしいものがありませんでした。
URLリンク(www.hakoniwa.net)
792:nobodyさん
08/01/21 23:09:44
>>787
亀レスですみません。ぐぐってみました。
>782-783 のような流れをたまに見るので業界の暗黙知が
あるのかと思いましたが特に無いようですね。
会社毎に見ていくと具体的な数字を出している所は少なかったですが、
少ないところで2MBと10Mb(=1.25MB?)でした。
793:nobodyさん
08/01/21 23:29:51
ムーアの法則があるので、数値は出しにくいところがある。
あるサーバで5秒くらいかかっていたのが、最新のでは1秒くらいで終わるので、
ぜんぜん問題にならなくなったとか。
でも、1分を1秒にするのはムーアの法則でも5年以上はかかるわけで、
そのくらいの規模はどう頑張っても無理だろという話だ。
794:nobodyさん
08/01/22 09:20:05
>>791
INCLUDE自体を抑制するやり方はわからんが、
If a BLOCK definition is not currently visible then the template
name should be a file relative to one of the INCLUDE_PATH directo-
ries, or an absolute or relative file name if the ABSOLUTE/RELATIVE
options are appropriately enabled.
これを利用すれば普通は十分じゃねーの?
795:nobodyさん
08/01/22 10:10:27
テンプレート編集自体はtoolkit使うわけじゃないだろ?
そこでチェックすりゃいいんじゃね?
796:791
08/01/23 00:37:55 fM6ljyqY
>>794
>もし、ブロック定義が見つからない場合は、テンプレート名はINCLUDE_PATHのディレクトリにあるファイルか、ABSOLUTE/RELATIVEオプションが付いていれば絶対/相対パスにあるファイルを対象とします。
とのことですが、相対・絶対でスクリプト指定できてしまうということですよね?
考えても理解できませんでした、具体的にどのように利用すれば大丈夫なんでしょうか?
>>795
たしかにテンプレート編集時にinclude等、使わせたくない文言を削除する方法もあるのですが、
入れようとしているシステムが銀行ほどではないんですけど、絶対にユーザにソースが漏れてはいけないシステムなんです。
(今後のシステム拡張等も含んで)チェックミスが出てきやすい作りで作るのはあまり好ましくないと考えています。
html-templateでも、includeなど規制する機能はなさそうですし・・・。
使いたい機能はifとloopだけなんですけど、
perlでセキュリティ完備したテンプレートエンジンほかにあるのでしょうか?
797:nobodyさん
08/01/23 09:55:40
>>796
HTML::Template には no_includes ってオプションがあるけど?
798:nobodyさん
08/01/23 10:07:27
INCLUDE_PATH以下に見られちゃいけないファイル置かないという選択肢はないの?
799:nobodyさん
08/01/23 10:27:22
>>796
そんな大事なシステムをお前程度のスキルの人間が任されていることに
激しく不安を感じるのだが...
800:nobodyさん
08/01/23 11:28:58
INCLUDE_PATHに関数渡すと・・・
801:nobodyさん
08/01/23 11:58:33
>>796
URLリンク(anond.hatelabo.jp)
802:nobodyさん
08/01/23 14:51:21
データベースにutf8でデータを入れて、携帯の絵文字対応のsjisで取り出そうとしようと思っています。
$s = Unicode::Japanese->new;
$s->set($aaa);
$str = $s->sjis-imode;
という風に、perlで記述したところ、0という値しか返ってきません。ちなみに$aaaをそのままprintすると、文字化けします。
何がいけないのかよくわかりません。どなたかお答えいただけるとうれしいです。
803:nobodyさん
08/01/23 14:59:42
sjis-imodeが悪いと思うよ。sjis_imodeだろ。
$str = ($s->sjis) - 'imode';
と書いたのと同じだな。いちおうエラーにはならないが、
use strictとuse warningsを使ってればいろいろ怒られる
のではまらないですむパターンの間違いなので、なぜ
使わなかったのかよく反省しとけ。
804:nobodyさん
08/01/23 15:07:11
さっそくのご返答ありがとうございます。
試してみましたところ、こんどは??????という文字列が返ってきました。
いま現在、iモードシュミレータを使って表示させているのですが、これは携帯を使ってテストしないのが悪いのでしょうか?
805:nobodyさん
08/01/23 15:27:16
>>804
iモードシミュレータとなるとそれはもはやPerlの話題ではないな。
適切なところへいって質問するほうがお互いのため。
その前に$strを16進ダンプ表示してみて期待したバイト列になってるか
どうかぐらいは確認しといた方がいいとは思うが。
806:791
08/01/23 21:46:29 fM6ljyqY
>>797-802
いろいろな案有難うございます。
一つづつ試してみます。
どうもありがとうございました。
807:nobodyさん
08/01/23 23:17:40 FgvU3OwA
だれか
>>775をいじってくれる
心のやさしくて暇なやつはおらんのか
サーバに日本語のファイルをUPしたいんだ
808:nobodyさん
08/01/23 23:18:24
するなといわれてそれを納得しておいてなんだそれはw
809:プログラミング歴2ヶ月
08/01/23 23:19:54 bNex267N
ローカルホストで動かしたときに、mkdirでディレクトリを生成できていたのに
いざwebにアップロードしてみると、ディレクトリの生成をやってくれません。
この場合、原因として何が考えられるのでしょうか。
ちなみにperlのパスはあっています。
mkdirなどでググって見ても、よくわかりませんでした。。。
ヒントだけでもいいんで、どなたかよろしくお願いします。(_ _)
810:nobodyさん
08/01/23 23:27:24
>>809
まずはパーミッションの確認からだろうな。
811:nobodyさん
08/01/23 23:52:28
>>809
他には2階層以上のディレクトリはmkdirで作れないとかかな?
812:プログラミング歴2ヶ月
08/01/24 00:03:36 +24Wb9Pu
>>810,811 さん
ご親切にご教授いただきありがとうございます。
先ほど、パーミッションを変更したところ解決いたしまして、とても感謝しております。
しかしそれと同時に新たな問題が浮上してきまして、困っています。。。
mkdirを行った後に、とあるdatファイルに文章を出力しているのですが、
出力した後の改行コードが■になってしまいます。。。
こっちもローカルホストではうまくいっていたのに、なぜなんでしょう??
813:nobodyさん
08/01/24 00:05:46
改行コードの違いかな?
URLリンク(www.tohoho-web.com)
814:nobodyさん
08/01/24 00:28:39
>>812
ヒント
・UNIXではLF、WindowsではCRLF。
・\nはLR、\r\nがCRLF。
・FTPのアスキーモードで転送すると自動相互変換してくれる。
815:プログラミング歴2ヶ月
08/01/24 00:53:36 +24Wb9Pu
>>813,814さん
解決しました。ありがとうございました!
マジに感謝してます。
816:nobodyさん
08/01/24 10:27:32
>>815
例えばxyzzyみたいに、改行コードを確認したり、変更できる
テキストエディタを入れておいたほうがいいよ。
817:nobodyさん
08/01/24 10:41:34
サクラエディタおすすめ。
818:nobodyさん
08/01/26 19:03:18
保守
819:nobodyさん
08/01/28 12:09:42 fVIm37qB
Perl初心者です。
簡単なPerl/CGIのプログラム(掲示板など)が書ける程度のレベルです。
mod_perlの超初心者向けの解説本、ウェブサイトがあれば教えてください。
できれば日本語でお願いします。
あと、今は退社された方が書いたらしい、現在稼動中のプログラムのソースを入手したんですが、
ソースの最後に
exit;
って思いっきり書いてたりするんですが、これって大丈夫なのでしょうか?
820:nobodyさん
08/01/28 12:53:50
URLリンク(multix.jp)
821:nobodyさん
08/01/28 15:21:58 eRROoQGz
ありがとうございます。
これに関して、オーバーライドを利用したコードを書いているとき、
ある関数(この場合はexit)が、どのパッケージに属しているかを調べる方法があればお願いします。
822:nobodyさん
08/01/28 16:14:02 Fd8GryNX
ときどき見かけるcodepageというのはどういうものなんでしょうか。
たとえば、TeraTermPro with SSHの設定でcodepageというのがあります。
ほかにもありますがこれを例にとります。
ヘルプやgoogle検索で調べても引っかからないのでここでおたずねします。
locale=japanese codepage=932
だとどうもShift-jisの設定をなんらかの形でやるみたいです(付属ヘルプ)。
locale=japanese codepage=65001
だとutf-8みたいです。
それで、私のマシンはWindowsなので、codepage=932で統一しておけばいいんでしょうか。
ケースバイケースなのでしょうか。
相手マシンがFreeBSDで通信することがあるのですが、その場合は、
設定の漢字受信/送信ともutf-8でokですか??
unixだとeucとも聞きますが、最近はutf-8化したほうがいいようなことも聞きます。
ので、よくわかりません。
もちろん、ソースを何で書くかはケースバイケースなのは知っています。
分からないのは、TeraTermの設定で
漢字受信/送信 と codepage という2つのよく分からない項目がある点です。
TeraTermは有名なので当然スレがあるかと思ったらありませんでした。
それにperlプログラミングでよく登場するので、ここで質問させていただきました
823:nobodyさん
08/01/28 16:22:56
exitはダメだけどexit(0)なら大丈夫、
実はそう言われてるけど逆で、exit(0)はダメだけどexitなら問題ない、
最近のヤツはどっちでもいい(具体的なバージョンはか書かれてない)、
色々と情報が混ざってて、調べれば調べるほど混乱してきた orz
824:nobodyさん
08/01/28 17:37:21
動いてんならいいじゃない
825:nobodyさん
08/01/28 18:19:41
そうします。
826:nobodyさん
08/01/28 18:33:58
UTF8の文字列で、全角ひらがなが入ってきた場合、全角カタカナに変換しようとしているのですが
思うように行きません。
$name =~ tr/ぁ-ん/ァ-ン/
一度、sjisやらecuやらに変換して、文字コードで置換させないと駄目でしょうか
827:nobodyさん
08/01/28 18:39:31
UTF8ならむしろ文字コード変換しないほうが置換しやすくないか?
828:nobodyさん
08/01/28 18:55:50
>>826
そんなことはない。
use utf8してないとかdecodeしてなくて$nameがバイトのままとか
そういうあたりじゃねーの?
use utf8;
binmode STDOUT, ":encoding(utf8)";
foreach (ord('ぁ') .. ord('ん')) {
my $h = my $k = chr($_);
$k =~ tr/ぁ-ん/ァ-ン/;
printf "%x %s %s\n", $_, $h, $k;
}
829:nobodyさん
08/01/28 19:04:20
>>822
> TeraTermは有名なので当然スレがあるかと思ったらありませんでした。
テラターム
スレリンク(linux板)
830:nobodyさん
08/01/28 19:21:58
>>829
誘導thx!! いやースレタイ検索で引っかからなかったもんで。
831:nobodyさん
08/01/28 21:13:04
確かにこりゃ罠だな……
832:nobodyさん
08/01/30 17:37:10 irpAKk1D
ActiveperlでローカルPC上に作成したWEBサイトにIE等でアクセスし、
その処理結果をファイルにしてデスクトップ上に出力したいのですが、
デスクトップまでのパスをどう取得すればいいか分かりません。
ログインユーザ毎にデスクトップのパスが変わってしまうので、
そのあたりを上手く解決できる方法があれば知りたいです。
833:nobodyさん
08/01/30 18:10:39
perlとは関係ないがユーザ毎に環境変数ってのが存在する
834:nobodyさん
08/01/30 18:43:24
use strict;use warnings;
use Win32::OLE;
my $sh = Win32::OLE->new('WScript.Shell');
print $sh->SpecialFolders("Desktop");
use strict;use warnings;
use Win32 qw/CSIDL_DESKTOP/;
print Win32::GetFolderPath( &CSIDL_DESKTOP );
835:nobodyさん
08/01/30 21:04:32 FClDhuIR
require Hoge;
は通るんですが、
no strict 'refs'; require "Hoge";
が通りません。Can't locateとなります。
文字列からrequireするにはどう書いたらよいでしょうか。
836:nobodyさん
08/01/30 21:12:10
Hogeってのを用意すればいい
837:nobodyさん
08/01/30 21:17:18
どうもです。
Hogeはあるつもりなんですが、前者と後者は同じものを指してないですか?
838:nobodyさん
08/01/30 21:29:04
拡張子を省略していたせいだった気がしました。ありがとうございました。
839:832
08/01/30 21:59:46
>>833
システム環境変数とユーザー環境変数ってやつですよね。
ここにあらかじめデスクトップへのパスを設定するという事でしょうか?
>>834
ソースありがとうございます。
実際に実行してみたんですが、CGIとして実行すると
SYSTEM ユーザ名義で実行され、ログインユーザでのパスが取れませんでした。
DOS窓から実行するとバッチリなんですが…。
少し調べた所、WMIで実現できそうな気がしてきたので
そちらを当たってみようと思います。ありがとうございました。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4893日前に更新/271 KB
担当:undef