Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0619nobodyさん
2006/07/17(月) 05:25:24ID:AcPhLonl0620nobodyさん
2006/07/17(月) 06:08:57ID:???0621nobodyさん
2006/07/17(月) 07:11:29ID:???mod_perlでも動かすのかな?
それより、local宣言だらけを心配した方がいいよ。
逆に、my宣言が全然ないとか。
0623nobodyさん
2006/07/17(月) 11:23:26ID:???> FTPと似たようなことができるみたいなので
> よく分からない状態で用いるのは、
> セキュリティ上危険な気がしました。
「FTPと似たようなこと」をやろうとしてるんじゃなかったのか。
にほんごってむずかしーね。
0624nobodyさん
2006/07/17(月) 12:15:35ID:???いう事に思い至らなかっただけでしょ。
0626nobodyさん
2006/07/17(月) 16:03:52ID:???http?
0627nobodyさん
2006/07/17(月) 16:31:38ID:???1.8014398509482e+016
ってなるけど実数表示させるにはどうすりゃいいのん?
0631nobodyさん
2006/07/17(月) 17:13:50ID:???perldoc bigint を見れば分かるけど、
> "bigint" is just a thin wrapper around various modules of the Math::BigInt family.
0633nobodyさん
2006/07/17(月) 22:53:09ID:???0634nobodyさん
2006/07/17(月) 22:57:20ID:???消防はもう寝な
0638nobodyさん
2006/07/17(月) 23:21:32ID:???0640nobodyさん
2006/07/17(月) 23:43:04ID:???18014398509481984
こうですか? わかりません><
0641nobodyさん
2006/07/17(月) 23:45:16ID:???0642nobodyさん
2006/07/18(火) 00:11:32ID:???user@localhost:~$ perl -Mbigint -e 'print 64**9, "\n"'
18014398509481984
user@localhost:~$ perl -v | grep v5
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
0643nobodyさん
2006/07/18(火) 00:24:40ID:DXYFSpfLこのような表記は許されるのでしょうか?
1)$TEST[100]に代入されている文字列を表示させたい
2)$TEST[***]<-ここに$A[1]を入れたい
$A[1]=100;
$TEST[100]='TEST';
print $TEST[ $A[1] ];
やはり・・・
$A[1]=100;
$TEST[100]='TEST';
$B=$A[1];
print $TEST[$B];
なのかなあ
0645643
2006/07/18(火) 00:46:23ID:DXYFSpfLソース記述が途中で間違っていたのかも知れなかったです。
この表記がまちがっていると思い込んで2時間位悩んでいましたm(_ _)m
0646nobodyさん
2006/07/18(火) 00:52:26ID:???0647nobodyさん
2006/07/18(火) 01:00:06ID:???0648nobodyさん
2006/07/18(火) 02:34:41ID:???5.8.4 だけど、use bigint で 18014398509481984 って結果でたよ
>643
大文字は定数で使われるのがほとんどなので、変数は小文字でどぞ。
0649nobodyさん
2006/07/18(火) 03:41:25ID:???1.(2/3)*(2/3) の解を 4/9 にするにはどうすればいいですか?
2.次に1.の解を 1/2.25 (分子を1)にするにはどうすればよいですか?
0650nobodyさん
2006/07/18(火) 03:50:18ID:RAKThs0C$ENV{'HTTP_COOKIE'}で何も取得できません!
作成直後ではなくて、ブラウザでリクエストを再送しても取得できません。
どんな原因が考えられましょうか!
0651nobodyさん
2006/07/18(火) 04:54:13ID:???>>628と同様に、bigrat or Math::BigRatでどうよ。
2はライブラリ任せにしないで、算数的に出力時にdenominatorをnumeratorで割れば?
0652nobodyさん
2006/07/18(火) 05:24:58ID:???use bigrat;
$a = (2/3)*(7/57);
print $a,"\n";
printf( "1/%f",1/$a);
%fのところはうまくいじらないと思い通りの出力にならないかも?
つーか7/8を1/xと表示したいときxは何になってほしいのか・・・?
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
まあ、そんな気になるなら一定の年数分の時間を最初に引いておけば?
■ このスレッドは過去ログ倉庫に格納されています