Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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即レスありがとうございます。
そのようにやったらできました、ありがとうございました!
0754nobodyさん
2006/07/20(木) 09:22:01ID:???0755nobodyさん
2006/07/20(木) 09:42:37ID:???0756nobodyさん
2006/07/20(木) 11:10:49ID:OwGfxrortest.cgiが呼ばれたときにtest.cgiの中で、まず初めにaccess.cgiを起動実行させてから
test.cgiの本処理に映りたいのですがさすがに無理でしょうか?
access.cgiはgif画像を一つ返してくるだけです。
0757756
2006/07/20(木) 11:37:22ID:OwGfxroruse LWP::UserAgent;
my $ua = new LWP::UserAgent;
$ua->agent('AgentName/0.1'.$ua->agent);
# リクエストを作成
my $req = new HTTP::Request(POST => 'http://hoge.com/access.cgi');
$req->content_type('application/x-www-form-urlencoded');
$req->content("id=get");
# ユーザ・エージェントにリクエストを渡し、返されたレスポンスを取得
my $res = $ua->request($req);
# print $res->is_success;
昔作ったCGIから拾ってイジッテいちおうこれで呼び出しはできたのですが、
access.cgiに自分のとは違うIPが記録されてしまうようです。
アクセス管理CGIの都合上できればIPが別のものになってほしくないんです。
また、できればネット経由でない方法で呼び出せればと思ったのですが。
cron使用の呼び出しと同じような感じができて、さらにIPが自分のものか127.0.01とかなら最高なんですが。
どうぞ玄人の方お助け宜しくお願いします。
0758nobodyさん
2006/07/20(木) 11:47:34ID:???0759nobodyさん
2006/07/20(木) 12:01:19ID:WCdGbBzjところが、openでエラーになります。
majordomoのファイルが
オーナー:mail
グループ:deamon
属性:777
なのが原因だと思うのですが、このファイルを上記条件から書き換えるようにするには、cgiのプログラム
からどのようにしたら良いでしょうか?
0760nobodyさん
2006/07/20(木) 12:12:22ID:???$!の値も示せよ。
0761756
2006/07/20(木) 12:13:08ID:OwGfxror0762nobodyさん
2006/07/20(木) 12:16:44ID:???その理屈ならYAHOOは死刑になっちゃいそうな勢いだな。
あんな有名なサイトが無許可で他人のサイトのアドレスを晒しまくって。
とりあえず削除申請してこいよ。
0763756
2006/07/20(木) 12:24:17ID:OwGfxror荒れるから止めて欲しいのですm(__)m
私あてのレスです。
本人である私がスルーしてるのですから、察してくださいませんか。
宜しくお願いします。
0764nobodyさん
2006/07/20(木) 12:35:40ID:???system('perl access.cgi');とか?
というか、そのaccess.cgiの返してくる画像は必要なんですか?
画像だけが、必要なら<img src="access.cgi">とか?
でも、そのくらい知ってそうっていう雰囲気ですよね・・・・・・・・
なんだろう・・・
0765756
2006/07/20(木) 12:46:10ID:OwGfxror言葉足らずだったかもしれません。ごめんなさい。
access.cgiはアクセスログを取っていくcgiなんです。
test.cgiは今仮で作ってるアクセス解析cgiなんです。
test.cgiからaccess.cgiを呼びたいのは最新の情報を読みたいからなんです。
つまりaccess.cgi直後のaccess.logが一番精度が高いわけです。
秒単位で誰がどこにいるかを表示してますので意外と重要なのです。
ですからaccess.cgiからの戻り値はまるでいりません。
要はaccess.cgiに処理をさせればいいだけなんです。
それこそ最悪access.cgiの中身をtest.cgiに書いて解決です。あまりにひどい決着ですが。
返してくるgif画像自体はまるでいりません。
長文すみません。ご飯を食べてまいります。
■ このスレッドは過去ログ倉庫に格納されています