Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0653nobodyさん
2006/07/18(火) 05:35:52ID:???$ENV{'HTTP_COOKIE'}で何も取得できなくて、
いったい何で”保存されてるのを確認した”のか、教えてください。
パッと思いつく原因としてはクッキーを出してるスクリプト
と受け取ってるスクリプトがあるディレクトリが別になってるとか?
どうやってクッキーを発行して、どうやって受け取ろうとしてるのか、
もっと詳細に報告してください。
0654650
2006/07/18(火) 09:21:50ID:???スクリプトはいっしょで、読み書きするスクリプトをリロードして確認したり、
読みと書きでパラメータを分けて行き来したりしています。
Set-Cookie: session=test;expires=;\n
と書いてます。index.cgi?a=1で書いてindex.cgi?a=2で読んでいます。
宜しくお願いします!
0655nobodyさん
2006/07/18(火) 09:28:15ID:???現在作ってるスクリプトで設定内容などは
$config = {
'test' => "テスト"
}
sub get{
my $pkg = shift;
my $hash = $config;
bless $config, $pkg;
}
my($cfg) = config->get();
print $cfg->{test};
この用にして設定内容を取得してます。
そして今回、$config の中に配列へのリファレンスを含めるようになり
@urls = (ずらずら〜っと);
と URL が書かれた配列へのリファレンスを
$config = {
'urls' => \@urls,
}
として $config へ設定しました。
この際に $cfg で値を取得する書き方としては
@{$cfg->{'urls'}}
で正解なのでしょうか?
もっときれいな書き方や 「こっちのほうが解釈としては正解じゃね?」 みたいな
書き方があれば教えていただければ幸いです。
0657nobodyさん
2006/07/18(火) 10:19:23ID:???0658nobodyさん
2006/07/18(火) 10:26:39ID:???perlのoopの使い方がどうみてもむちゃくちゃなので勉強しなおしてください。
変な癖をつけると後で苦労するよ。
0659nobodyさん
2006/07/18(火) 10:32:26ID:???OOPをやりたいなら
package Config;
sub get{
my $pkg = shift;
my $hash = shift;
bless $hash, $pkg;
}
.....(いろんなメソッド)
package main;
my $cfg = Config->get({'urls'=>\@urls})
そのままだと、sub getが意味ない
>>658
perl oopのいい入門て見たことない希ガス・・・
0660nobodyさん
2006/07/18(火) 10:35:44ID:???この書きかたでいこうかと思います
>657
以前このスレだかどこかで KENT の様に設定用変数を数多く
用意するのは綺麗じゃないみたいなことがあったときに、
私が
config.pl
%config=('test'=>2);
sub getconfig{return %config;}
my %config=&getconfig();
ってやってるって書いたら効率悪いって言われたもんで、
ちょっと書き直してたらこうなった次第です。
0661nobodyさん
2006/07/18(火) 10:35:45ID:???0662nobodyさん
2006/07/18(火) 10:43:45ID:???関数コールするよりもオーバーヘッドは少ないかなって思ったので。
数回から数十回のコールでオーバーヘッドを気にするのは無駄
とは分かってはいたんですがやっぱりスマートな書きかたではなかったですか(-_-;
0663nobodyさん
2006/07/18(火) 10:46:41ID:???0664nobodyさん
2006/07/18(火) 10:52:28ID:???print "content-type: text/html\n";
print "Set-Cookie: session=test\n";
print "\n";
print $ENV{HTTP_COOKIE};
とりあえずうちの環境だと、これを2回読み込むと画面にsession=test
と出るので、それでだめだったら環境がおかしい
0665nobodyさん
2006/07/18(火) 12:38:15ID:???Set-cookie:〜\nContent-type:〜\n\nってなってたのをクッキーとContent-typeの順番を入れ替えただけで
行けたっぽいです。書き込み時がおかしかったようです。
ネットで順番はどっちでもいいようなことを見たし、実際クッキーらしきものが書かれていたのでこれでいいのかと
思ってました。ざっと試しただけですが、これから詳しいことを検証したいと思います。
あと、バグ入りクッキーは本当にクライアント環境によって挙動が違いました。(会社では場合によって読めた)
0666nobodyさん
2006/07/18(火) 13:25:28ID:???となっていたに1票
0667nobodyさん
2006/07/18(火) 14:04:40ID:???ていうか、ただのハッシュとして使うだけなら
なんでオブジェクトにするのか全く不明。
それなら単純にハッシュを宣言して、読み込むだけの方が良い。
0669nobodyさん
2006/07/18(火) 14:43:02ID:???それでも、やはり順序不問ってことは、どっかでケアレスミスしたかもしれません。今夜再検証してみます。
0670nobodyさん
2006/07/18(火) 15:15:34ID:???外部ファイルにhashで設定を書いてrequireすると、
同じ内容の変数が2つ存在することになって無駄があるので
オブジェクトにした次第です。
0671nobodyさん
2006/07/18(火) 15:24:45ID:???その考え方が間違ってる。そんなことでオブジェクトにしちゃいけない。
だったらまだ、>>660 にある最初の書き方の方が、考えがマトモ。
同じ内容の変数が2つになるのが嫌なら、
外部ファイルの変数を別のハッシュに代入せずに、そのまま使えば良いだけの事。
0672nobodyさん
2006/07/18(火) 15:28:41ID:???書くにはどうしたら良いんでしょうか?
単純に
if($data !=~ /MOJI/)
という書き方では反映されないみたいなんですが。
0673nobodyさん
2006/07/18(火) 15:31:12ID:???0674nobodyさん
2006/07/18(火) 15:31:47ID:S5V5gxsh「○○かつ△△」を文字列で扱う方法はやはりないのでしょうか?
$type1 = 'BAKA';
$type2 = 'KASU';
if ( $type1 eq 'BAKA' and $type2 eq 'KASU')
みたいにするには数値をそれぞれ代入してからやるべきなのでしょうか?
0676nobodyさん
2006/07/18(火) 15:38:45ID:???0677672
2006/07/18(火) 15:39:57ID:???if($data =!~ /MOJI/)
と書いてみましたがエラーが出て動かないです。
どこが間違っているんでしょうか?
>>674
単純に
if ( ( $type1 eq 'BAKA' ) && ( $type2 eq 'KASU' ) )
で良いじゃないでしょうか。
0678nobodyさん
2006/07/18(火) 15:42:18ID:???0680nobodyさん
2006/07/18(火) 15:47:11ID:S5V5gxsh数値比較では && や and を使えますが
文字列でも同じように && や and を使っていいのかどうかということです
0681nobodyさん
2006/07/18(火) 15:47:29ID:???最近の質問見てるとネットだけで独学の人が多いような気がする。
0684nobodyさん
2006/07/18(火) 16:01:37ID:???0685nobodyさん
2006/07/18(火) 17:42:03ID:???その都度デリファレンスするのって、見た目が余り綺麗じゃないからその案は
以前考えてるときに却下しました。
0686nobodyさん
2006/07/18(火) 17:51:43ID:???誰がデリファレンスしろと…。
>>675 が言ってるのは、
外部ファイルで %config を定義して、return ¥%config; でリファレンスを返せば
同じハッシュが2つにならないということでしょう。
使う時は $cfg->{'hoge'} みたいなので良いんだし。デリファレンス要らない。
0687nobodyさん
2006/07/18(火) 18:24:24ID:???「とりあえず外部PL(PM)ファイルに設定をずらずらして require」 じゃなくて、
普通の(TXT)ファイルとかにCSVとかTSVみたいな感じで設定を書いて、
my $cfg1 = Config->new('config1.txt');
my $cfg2 = Config->new('config2.txt');
みたいな感じで設定取ってくるもんじゃないの?
>>655みたいに値を得たいときは my @url = $cfg1->get('url'); とかしてさ。
そうじゃないならOOPの意味もないな、って思うんだけどw
0688nobodyさん
2006/07/18(火) 18:29:25ID:???0689nobodyさん
2006/07/18(火) 18:54:51ID:9xyhckKLページの更新をムダに頻繁にするのはいやなので30秒設定にしています。
要はチャットなのですが。
試験的に稼動してるのですが、相手にメッセージが届く前に相手が帰ってしまうようです。
そこで思ったのですが、こちらが書き込みをしたら即座に相手のブラウザに更新命令を
出すといったようなことはPerlCGIでは実現できませんでしょうか?
そんなことできたら怖すぎるかな?とも思いましたがやはりそんな危ない技術は正攻法では不可能ですかね?
ハッキング状態になっちゃいます?
アドバイスお願いします。
0691nobodyさん
2006/07/18(火) 19:18:16ID:???>こちらが書き込みをしたら即座に相手のブラウザに更新命令を
>出すといったようなことはPerlCGIでは実現できませんでしょうか?
できるわけないだろ。
そんな凶悪なセキュリティホールが空いてたらすぐに緊急のパッチが出るわ。
要は、最初のアクセスのときだけ3秒ぐらいでリロードして
その自動メッセージとやらを表示させて、
2回目以降は通常の30秒リロードにすれば良いんじゃないの?
0692nobodyさん
2006/07/18(火) 19:45:12ID:???共有サーバでやるとヌッ殺される。
0693nobodyさん
2006/07/18(火) 19:45:35ID:???あぁなるほど。
ファイルの最後で1;ってやるところで返すのはやらないほうがいいですか?
(出来るかどうか知らないけど)
>687
iniファイルのような設定ファイルは記述ミスに対するコーディングが生じるので考えてませんでした
勉強も兼ねて初めてパッケージ(もどき)を考えてみたけど、使いどころとか、使い方とか難しいですね
0694nobodyさん
2006/07/18(火) 19:49:14ID:???つーか値を得たいときは$self->{'config'}->{'value'}
もしくは$selfをconfig hashそのものにして、$self->{'value'}。
そもそも関数で値を”とってくる”という発想自体が間違ってる。(OOPなら
0695nobodyさん
2006/07/18(火) 19:52:09ID:qN74jZ6Aprint $count;
-------------------------------
↑のような構文を打ったところ
(SQLで返される数字が出力されるようにしたつもり)
print $countが↓のように出力されてしまいます。
-------------------------------
DBI::st=HASH(1234abcd)
-------------------------------
正しく数字が返されるようにするにはどのようにしたらよいでしょうか?
0696nobodyさん
2006/07/18(火) 19:55:35ID:???0698nobodyさん
2006/07/18(火) 20:04:32ID:???0700nobodyさん
2006/07/18(火) 20:06:25ID:???0701nobodyさん
2006/07/18(火) 20:10:22ID:???0702695
2006/07/18(火) 20:11:15ID:qN74jZ6Amy $count = $db->prepare("select count(*) from hoge where hogehoge = 1");
$count->execute;
print $count;
-------------------------------
↑のような構文を打ったところ
(SQLで返される数字が出力されるようにしたつもり)
print $countが↓のように出力されてしまいます。
-------------------------------
DBI::st=HASH(1234abcd)
-------------------------------
正しく数字が返されるようにするにはどのようにしたらよいでしょうか?
0703nobodyさん
2006/07/18(火) 20:13:37ID:???0704nobodyさん
2006/07/18(火) 20:15:42ID:???0705695
2006/07/18(火) 20:32:22ID:qN74jZ6Aありがとう
0706nobodyさん
2006/07/19(水) 00:26:20ID:aJ2dkknB$a = 31536001
に対して年$year 月$manth 日$day 時$hour 分$minute 秒$second
を求めるには地道に
$year = $a - 3153600;
とした方がいいのでしょうか?
それとももっと簡単な方法がありますか?
よろしくお願いします
0707nobodyさん
2006/07/19(水) 00:32:18ID:???0708706
2006/07/19(水) 00:35:08ID:aJ2dkknBあああ、すいません
ミスってました
31536001は31536001秒ということです
秒、(繰り上がるならそれぞれ)分、時間、日、月、年を求める方法があるのかどうかです
0709nobodyさん
2006/07/19(水) 00:38:52ID:???>>708
日数までは良いとしてだ。
一月の長さは同じじゃないわけだが、そこのところどうやって計算する気よ
0710nobodyさん
2006/07/19(水) 00:41:06ID:???$a = 31536000; # ← 3600*24*365
で、$a = 86401 なら 暦とか関係なく 1日と1秒 って経過時間だしたいってことね。
じゃあ単に
my @dates = gmtime($a);
とかやればいいんじゃねのw
0711706
2006/07/19(水) 01:03:53ID:aJ2dkknB年は365、日は30にするつもりです
>>710
そうです
ちょっと
my @dates = gmtime($a);
やってみます
0712706
2006/07/19(水) 01:08:22ID:aJ2dkknB51101071500
になります
0713706
2006/07/19(水) 01:25:12ID:aJ2dkknBちゃんと>>711でできました
ただ気になるのがある時点での時間を求めるので
月の表示がうまくいきません
$a = 61;
の場合は1分と1秒なのでそのまま0月カウントになりおkなんですが
11月の次が12月を飛んでしまいます
かといって$mon+1;をすると$a=61;のときに1月1分1秒になっていまいます
これは仕様でしょうか?
0714nobodyさん
2006/07/19(水) 01:51:28ID:???まず小学校まともに卒業してカレンダーと時計の見方を身につけろよ。
0715nobodyさん
2006/07/19(水) 02:04:47ID:???$mon は "11月" じゃなくて "11ヶ月目" なんだろ? +1する必要なんてない。
まあ $day を -1 してる (らしい) のはよかったと思うよw
0716706
2006/07/19(水) 02:12:29ID:aJ2dkknBなんかおかしいな〜と思ってずっとカレンダー見てました
ようやく謎が解けましたw
ありがとうございます
ただ>>711のようにすると100年を超えると解がヌルになるようです
$a = 31536000000;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($a);
$year = $year-70;
$mday = $mday-1;
print $year."年".$mon."月".$mday."日".$hour."時".$min."分".$sec."秒";
ヌルにしないためにはどうすればいいっすか?
0717nobodyさん
2006/07/19(水) 02:19:09ID:WORWfBlMこの際、ファイル名にタイムスタンプがついて1153238735__photo.jpgというようになりますが、
この「__photo」の部分を取って「1153238735.jpg」にする方法は無いでしょうか?
Content-dispositionのヘッダを使えばいいらしいですが具体的な方法が解りません。
よろしくお願いします。
0718nobodyさん
2006/07/19(水) 02:20:38ID:???▽2038年問題
http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C
まあ、そんな気になるなら一定の年数分の時間を最初に引いておけば?
0720706
2006/07/19(水) 02:33:21ID:aJ2dkknBわかりました
0721nobodyさん
2006/07/19(水) 13:05:06ID:???SSIをmod-perlで動かすにはどうしたらいいんでしょう?
CGIからmod-perl移行時にindexページはindex.html(SSI)からindex.cgiになるように設定したんですが、
GoogleのページランクとかもあるのでSSIを使いたいんですが、、
mod-perlに移行したらSSIが全く効いていないんです(-o-;
呼び出すperlがindex.plだとしたら、それ単体では問題なく実行されるんですが。。
0722nobodyさん
2006/07/19(水) 13:13:26ID:???http://www.google.co.jp/search?hl=ja&q=perl+SSI+mod_perl&lr=lang_ja
0724nobodyさん
2006/07/19(水) 19:58:46ID:???gmtimeとかって普通に現在時刻+αぐらいを扱うためのものだから、
100ねんとか、それ以上のことやろうとしてるんだったら、
自分でなんか作ったほうがいいと思う・・・
0725nobodyさん
2006/07/19(水) 20:00:25ID:???0726nobodyさん
2006/07/19(水) 20:03:34ID:+wpVYCo5$ENV{"HTTP_USER_AGENT"}
この中の文字列を正規表現とか掛ければいいのでしょうか?
$ENV{"HTTP_USER_AGENT"} =~ /internet explorer/i;
で大丈夫でしょうか?自分はIE6ですので他のバージョン確認できませんので宜しくお願いします
0727726
2006/07/19(水) 20:05:37ID:+wpVYCo5$ENV{"HTTP_USER_AGENT"} =~ /IE/;
これでいいのでしょうか?ちなみにOSは虫です。
0728nobodyさん
2006/07/19(水) 20:17:07ID:???自分のPCなら火狐とかモジラとかオペラとかインストールして
実験すれば?
あとは、自分のページの中で一番アクセスのあるページでユーザエージェントを記録して、
どういうブラウザのアクセスがあるか観察して判断
0729571
2006/07/19(水) 20:40:38ID:+wpVYCo5この雰囲気からすると、そんな簡単なIEとそれ以外の判別方法は存在しないということでしょうか。
確かに今後IEという文字が入るIE以外のブラウザが出る可能性もありまよもんね。
なかなか制作側には不便な環境なんですね。
レスありがとうございました。
もう少しだけ粘ってみます・
0730nobodyさん
2006/07/19(水) 20:47:29ID:???今のところ、User-Agentに"MSIE"が含まれる一般的なブラウザはIEだけ。
0731571
2006/07/19(水) 20:48:27ID:+wpVYCo5これで行こうと思います。
728さんもよければ参考にしてください。
それでは失礼します。
0732571
2006/07/19(水) 20:50:23ID:+wpVYCo5どうやらOperaが危ないようです。
$ENV{"HTTP_USER_AGENT"} =~ /MSIE/ and $ENV{"HTTP_USER_AGENT"} !~ /Opera/;
これで90%程度はいけるのではないかと思いますが。
0733nobodyさん
2006/07/19(水) 21:00:22ID:PWLYocjqUse of uninitialized value in substitution (s///)
というエラーが出ました。例えば下記の場合、@_が問題っぽいんですが、
どのように直したらいいでしょうか。
sub reformat_date {
my %args = (date => '', @_);
my $tmp = $args{'date'};
$tmp =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3 00:00:00/;
return $tmp;
}
0734nobodyさん
2006/07/19(水) 21:04:25ID:???0736nobodyさん
2006/07/19(水) 21:21:25ID:???してるものと仮定して。
my %args = (date => $_[0] );
つかこれだけだったら、%args てまったくの無駄なんだけど…
で、入力は何?
0737nobodyさん
2006/07/19(水) 21:22:42ID:???ブラウザの「戻る」を押すと、入力フォームにデータが残ってる状態です。
二重のpostを防ぐために、postした後、戻るを押すと、
「ページの期限切れ〜」みたいな表示にする方法は無いんでしょうか?
0738nobodyさん
2006/07/19(水) 21:23:48ID:???0740733
2006/07/19(水) 21:34:01ID:???こういうシンプルなのも%argsになってます。736さんのように変更してもだめでした。
ていうか、全く同じ関数をテスト用のシンプルなコードに書いたら
エラーがでませんでした。-wは呼び出し元との兼ね合いでもエラー出すんでしょうか。
0741nobodyさん
2006/07/19(水) 21:36:59ID:???reformat_date( date => $hoge )
とかやってて、$hoge が未定義(undef) なんじゃないの?
$tmp =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3 00:00:00/ if (defined $tmp);
とかにしてみればどうよ
0742733
2006/07/19(水) 21:37:48ID:???0743733
2006/07/19(水) 21:43:08ID:???呼び出し側が場合によって未定義のときがあったのが原因でした。
てっきり、字面だけでデバッグされているのかと勘違いしてましたので
呼び出し側をチェックしてませんでした。
ありがとうございました!
0745nobodyさん
2006/07/19(水) 22:22:19ID:???pragma no-cacheあたりで検索
まあ、そういう仕様の板が便利かどうかは微妙な気もするけど、
むしろ、パスワードで削除機能とかの方がエレガントなような・・・?(作るのはめんどくさいけど
0747nobodyさん
2006/07/20(木) 00:14:49ID:???print "pragma:no-cache\n\n";
とかこういうこと?それともパスワード機能の実装の仕方自体語れってこと?
後者だったら拒否w
0748nobodyさん
2006/07/20(木) 00:42:07ID:EXDq6RmQsub main{
local @tmp = ("aa","bb");
print "$tmp[0]"." "."$tmp[1]\n";
&subroutine(\@tmp);
print "$tmp[0]"." "."$tmp[1]\n";
}
sub subroutine{
local $tmp = @_[0];
$tmp = ("cc","dd");####################################
print "$tmp->[0]"." "."$tmp->[1]\n";
}
というコードを書きました。
しかし#############の行でエラーになってしまいます。
要するにmainルーチンから@tmpのポインタを送ってサブルーチン側では@tmpに("cc","dd")を代入したいのです。
サブルーチンで
$tmp->[0] = "cc";
$tmp->[1] = "dd";
とやれば済むのですが、こうではなくて = ("cc","dd")という風に代入したいのです。(実際はsplitとかを使って代入するから)ポインタを使ってどういう風にしたらよいかわかりません。ご教授おねがいします。
0749nobodyさん
2006/07/20(木) 00:48:05ID:???@{ $_[0] } = ("cc", "dd");
}
こういう事?
他の部分に関してはつっこんだら負けかなと思っている
0750748
2006/07/20(木) 00:50:00ID:EXDq6RmQ即レスありがとうございます。
そのようにやったらできました、ありがとうございました!
■ このスレッドは過去ログ倉庫に格納されています