トップページphp
1001コメント371KB

Perlコーディング初心者質問スレ Part 49

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/05/31(水) 04:32:28ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0261nobodyさん2006/06/07(水) 02:07:38ID:???
できたー!
0262nobodyさん2006/06/07(水) 02:11:01ID:???
ええw ('A`)

まあおめでとう!w 何が悪かったのやらw

てか自分のPCに perl 入れて、コマンドプロンプトとかから perl 実行すること覚えようぜ。エラーメッセージでて便利よ。
0263nobodyさん2006/06/07(水) 02:14:36ID:???
> てか自分のPCに perl 入れて、コマンドプロンプトとかから perl 実行すること覚えようぜ。エラーメッセージでて便利よ。

無限 fork するようなもの書いたときにおかしくなるから嫌。
0264nobodyさん2006/06/07(水) 02:14:53ID:???
>>262
うい。perlは入れた(はず)ですが、実行の仕方(設定の仕方?)が分からんとです。
これから覚えます。

ちなみに、もともと作ってた方のページも直しましたが、
読み込み元ファイルの内容が表示されんとです。

まだまだ道は長いとです。

ありがとうございました。
0265nobodyさん2006/06/07(水) 02:19:08ID:???
>>263
えぇw

>>264
そのフォルダからcmd開いて、 「perl hoge.cgi」 とか打つだけだす。
あと、$/ 変えて読み終わったあとは、変な挙動起こさないように、
$/ = "\n"; って設定しなおしていくといいかも。
0266nobodyさん2006/06/07(水) 02:23:00ID:???
>>265
> そのフォルダからcmd開いて

いきなり意味分かんないんで、このスレのログ保存しておきました。
もうちょっと頭が良くなってから読み返します。

こんな夜中までありがとうございます。
0267nobodyさん2006/06/07(水) 02:29:37ID:???
>>184 ありがトン
0268nobodyさん2006/06/07(水) 02:37:25ID:???
> そのフォルダからcmd開いて

確かに、意味不明ですね。
0269nobodyさん2006/06/07(水) 03:07:49ID:???
意味不明だけど言いたいことは分かる
0270nobodyさん2006/06/07(水) 03:08:00ID:???
まじかw

↓こういうのをやるとか、
http://arena.nikkeibp.co.jp/tec/winxp/20050309/111687/

どっかのフォルダの ツール → フォルダオプション → ファイルの種類 → CGI ファイル → 詳細設定 で、
新規 → アクション 「cmd」 → アクションを実行するアプリケーション 「cmd.exe "cd %l"」

ってやると、「そのフォルダからcmd開いて」 な感覚になるんだけど・・・普通そう言わないのかな・・・(´・ω・`)
0271nobodyさん2006/06/07(水) 04:27:27ID:???
アクセサリ -> コマンドプロンプト を実行して、
cd "c:\perlスクリプトがあるディレクトリ"
perl スクリプト名.pl

が親切では?
0272nobodyさん2006/06/07(水) 05:24:07ID:???
>>271
うん、そうなんだけど、
ファイルのディレクトリが D:ドライブだとまた違うし、
何度も使うなら、cd 〜フォルダ名 とか打つの省略できる方が楽だと思って。
0273nobodyさん2006/06/07(水) 05:51:48ID:???
>>272
今日から perl 勉強します yo! ってひとが、そんな設定やると思う?

コマンドプロンプト開いた時点で、その人のホームディレクトリにいるから
誘導するのはそれほど難しくないよね。
0274nobodyさん2006/06/07(水) 08:11:05ID:???
Microsooftが配布してるツールとか、窓の手とかのカスタマイズツールで、
エクスプローラのフォルダから DOS 窓を開けるようになる。
そうすれば一々 CD しなくてもいいし、perl への PATH が通ってれば perl ってだけで
起動できる。

ちなみに cmd とか commasnd とかから起動すると速攻で窓閉じるから駄目よw
0275nobodyさん2006/06/07(水) 10:29:37ID:???
あるソースを読んでいて分からないところがあるので質問させて下さい。

@{$a}{@$b}

これってどういう意味なんでしょう?
そんなに難しいことじゃないと思うんですが、
perlは慣れていないので苦労しています。
宜しくお願いします。
0276nobodyさん2006/06/07(水) 10:44:11ID:???
>>275
例えば、
$a = 'hash';
$b = ['a', 'b']; # 配列のリファレンス
とすると、
@{$a}{@$b} → @hash{'a', 'b'} → ($hash{'a'}, $hash{'b'})
のこと。
02772752006/06/07(水) 10:54:10ID:???
>>276さん
そういうことだったんですね。
助かりました。有難うございました。
0278nobodyさん2006/06/07(水) 13:05:38ID:???
配列とソートに関しての質問です
左は日付です

--20060101--aaaa----
--20060423--bbbb----
--20060514--cccc----

なんてのが書いてあるファイルを読み込み @dataとします
まず@dataを表示させてみると2行目からの頭に半角のスペースが入ります
これはなんでしょうか?

さらに

foreach(@data){
if( /(--(\d*)--\w*----)/){
$list {"$2"}=$_;
}}

foreach $key (sort keys %list){
push @htm ,$list{$key};}

とし、これをもう一度展開して表示させてみると、同じ日付がある場合に
誤動作して読み込まれません
改善するにはどうしたらいいでしょうか?
0279nobodyさん2006/06/07(水) 13:14:37ID:???
>>278
行と改行コードに関する質問です

読み込み
もう一度展開

なんてのが書かれている質問を読み込みます
これはなんでしょうか?

> 頭に半角のスペースが入ります
> これはなんでしょうか?
 自分で書いているとおり半角のスペースなのではないでしょうか。

さらに

誤動作して読み込まれません

と書いてあるので考えてみると、コードは動いているのに質問する場合なので
解釈がうまくできません
改善するにはどうしたらいいでしょうか?
02802782006/06/07(水) 13:20:29ID:???
質問の仕方が悪いのはご容赦ください
0281nobodyさん2006/06/07(水) 13:28:36ID:???
>>278
> 半角スペース
定番FAQ
print "@data";とやってるだろ。
配列を文字列内に入れようとすると$"(デフォルトで半角スペース)で連結されるからこうなる。
むやみにダブルクォーテーションで囲むのは止めましょう。
ちなみにprint @data;の場合は$,で連結される。これはデフォルトで空文字列。

> 同じ日付
%listの中に配列を作って複数の値を記録できるようにすれば良い。
foreach (@data) {
push @{$list{$1}}, $_ if /--(\d*)--\w*----/;
}

foreach my $key (sort keys %list){
push @htm, @{$list{$key}};
}
0282nobodyさん2006/06/07(水) 13:29:56ID:???
>>278
@dataはファイルから丸ごと読み込み
@data = <FH>;
で、@dataを表示する時に
print "@data";
とかやってるんじゃないの?
だったら頭にスペース入るだろうね。

2つめは当たり前でしょう。
同じ日付があれば、データが上書きされるので。
ハッシュの先を配列にするとかしないと。
0283nobodyさん2006/06/07(水) 14:35:06ID:CY60cgj5
wiki記法で書いたテキストをhtmlに反映したいのですけど
そういったモジュールってありますでしょうか?

CPANでwikiで検索したら数があまりに多すぎて。。。。。

02842782006/06/07(水) 14:55:55ID:???
>>281 >>282
有り難うございます

push @{$list{$1}}, $_ if /--(\d*)--\w*----/;
この部分がエラーを発生します

もうちょっと勉強してみます
02852782006/06/07(水) 14:57:52ID:???
失礼しました、大丈夫でした、m(_ _)m
0286nobodyさん2006/06/07(水) 16:04:17ID:???
それだと要素数が1の配列ができまくってモヤっする
0287nobodyさん2006/06/07(水) 16:08:10ID:???
文法的に正しいとか間違ってるとかは置いといて、スカラーとか配列とか、
最初に空のデータとして宣言しとかないと何か不具合起こすことってあるの?
0288nobodyさん2006/06/07(水) 16:22:34ID:???
>>287
Cみたいに初期化しないと変な値が書き込まれてるって事は無い。

ただし、配列かどうか分からない所にいきなりpushしたりするとエラーになる。

my %hash;
my %data = ('a' => 1, 'b' => 2, 'c' => 3);
while (my($key, $val) = each %data) {
 push($hash{$key}, $val); # Error(配列に初期化してないから)
}
0289nobodyさん2006/06/07(水) 16:25:30ID:4ldG4rWr
winxp
perl5.8.8

ウェブ上で使ってるプログラムをローカルに持ってきたらエラーがでました。
ウェブのperlは5.8.1です。
そこで質問です。

use strictしてるプログラムをperl -cに掛けてエラーが出ないのにapacheのログに
[Wed Jun 07 16:06:23 2006] [error] [client 127.0.0.1] Premature end of script headers: c:/program files/apache group/apache/htdocs/public_2/system/system.cgi
[Wed Jun 07 16:06:23 2006] [error] [client 127.0.0.1] Can't use an undefined value as a HASH reference at c:\\PROGRA~1\\APACHE~1\\apache\\htdocs\\public_2\\system\\system.cgi line 427.\n
と出て、strictを外すと
[Wed Jun 07 15:47:53 2006] [error] [client 127.0.0.1] Premature end of script headers: c:/program files/apache group/apache/htdocs/public_2/system/system.cgi
[Wed Jun 07 15:47:53 2006] [error] [client 127.0.0.1] substr outside of string at c:\\PROGRA~1\\APACHE~1\\apache\\htdocs\\public_2\\system\\system.cgi line 445.\n
とエラー内容が変わるのはなんですかね。

ウェブ上ではなんのエラーもなく動作してる時点でコードに問題はないと思うのですが。
0290nobodyさん2006/06/07(水) 16:28:46ID:???
>>288
ほぉ、なるほど、そういうケースがあったのね。
勉強になりました。ども。
0291nobodyさん2006/06/07(水) 16:28:50ID:???
>>289
apachのえらーろぐみたらえーやん。
0292nobodyさん2006/06/07(水) 16:30:26ID:???
>>289
use strict; してるかどうかによって警告が出る位置が違ってる。
それから、エラー読もうよ…。
substr が文字列境界超えてるって。

多分、見えないだけで、webサーバ側のログには延々とそれが書き込まれてる。
02932892006/06/07(水) 16:40:43ID:4ldG4rWr
>>291
すみません。先ほどのapacheのエラーログです。
>>292
文字列境界越えてるって使い方がおかしいってことですかね。<strong>${\substr($db_all_field_html{ordertime},0,4)}年${\substr($db_all_field_html{ordertime},4,2)}月${\substr($db_all_field_html{ordertime},6,2)}日
こういうことはしてます。でもウェブの方ではエラーログには何も残らず、ちゃんと表示される。
自宅では表示もできないし、ログにも
残る。

それにしても構文レベルのエラーならperl -cでひっかかると思ったのですが、
構文はあっているけど、実際に処理をしたら無理だった。とかあるんですかね?
それでウェブの方では実際にやっても大丈夫だったけど、自宅の法では実際に無理だったみたいな誤差ですかね。

strictを外すとエラーの行が変わるのは気づいてたのですが、どうも構文チェックがokでてる以上
何をすればいいかわからなくて。
0294nobodyさん2006/06/07(水) 16:41:02ID:???
>>288
僕の個人的かつ大胆な推測によると、
仮に $hash{$key} の値を配列リファレンスで初期化していたとしてもエラーが出ると思うのだ。

それ、デリファレンスしてねえからな。
02952942006/06/07(水) 16:48:28ID:???
補足:
未初期化なナニをデリファレンスすると、perl はその時点から「そのように」扱ってくれる。
だから >>288 のようなケースでは個別の初期化は不要。いや、してもいいけどさ。
0296nobodyさん2006/06/07(水) 17:09:37ID:???
>>294
その通りだw
0297nobodyさん2006/06/07(水) 17:10:08ID:???
>>293
何か値が入るとあなたが仮定している変数が、どこかで undef ってると思われます。
それぞれのタイミングで各変数の値が期待通りになっているかチェックしましょう。。

-c スイッチの syntax OK は 「perl によって曖昧さなくパースできますよ。一応ね」 という意味なので、セマンティクス上のバグは見つけてくれません。
代わりに -wc を使うようにすると警告も併せて示してくれます。
0298nobodyさん2006/06/07(水) 17:15:43ID:???
てかこれ、他人のサーバにエラーログを延々と残す迷惑な奴の典型例だな。
02992892006/06/07(水) 17:20:02ID:4ldG4rWr
>>297
ありがとうございます。
-wcやってみます。

とりあえずsubstrのあの記述を抜いて、strictを外すと表示ができるようになりました。
今はstrictでない部分を探してます。

ところでもしかして、5.8.1と5.8.8では何か違うんですかね。そう思えてならないです。
5.8.1が手に入ればわかりやすいですが。
0300nobodyさん2006/06/07(水) 17:48:23ID:???
末尾以外の改行(特定の文字列でも良いんですが)を取るにはどうすれば良いですか?
$text =~ s/\r\n\w//g;
とかだと、直後の1文字も消えてしまうし・・・ヒント下さい。
0301nobodyさん2006/06/07(水) 17:52:35ID:???
>>299
perl58[2-8]delta に変更点が書いてある。
http://search.cpan.org/~nwclark/perl-5.8.8/

>>300
s/\n(?!$)//g;
ついでに http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
03023002006/06/07(水) 18:01:42ID:???
>>301
ありがとうございます!
$が末尾、!$が末尾じゃない、ってことで?が条件文として働いてるってことですかね。

改行コードって実は結構複雑だったんですね。参考にします。
みなさんデータの読み込みのときに毎回コードの変換して・・・
って、書き込みの段階で変換してれば読み込みのときには必要ないのか・・・。
0303nobodyさん2006/06/07(水) 18:11:06ID:???
>>293
perldiagによると、左辺値コンテキストの時にエラーが出るとあるけど、
そこらへんは大丈夫?
0304nobodyさん2006/06/07(水) 18:26:26ID:???
>>302
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html#looking_ahead_and_looking_behind
0305nobodyさん2006/06/07(水) 18:30:05ID:???
配列の任意の位置の要素を削除したり追加したりする簡単な方法ってありますか?

[例]
@number = (1,2,3,4,5,6,7,8,9,10);

@number = (1,2,3,5,6,7,8,9,10);4番目の要素を削除
としたり、
@number = (1,2,A,3,4,5,6,7,8,9,10);3番目に要素を追加
としたり。
0306nobodyさん2006/06/07(水) 18:35:35ID:???
splice
ぐぐれって・・・
0307nobodyさん2006/06/07(水) 18:41:37ID:???
>>306
すみません。
超初歩的な質問だったようですね。
0308nobodyさん2006/06/07(水) 21:34:12ID:???
http://d.hatena.ne.jp/palmo/20060606/grep
ここの最後の疑問を読んで、確かにそうだなぁと思ったので、こちらで質問させてください。

grepやmapの第一引数にEXPRを指定すると、何度も評価されますよね?
でも、普通に考えたらgrepやmapが実行される前に評価されてしまうのではないでしょうか。
この遅延評価はgrepやmapだけ特別なんでしょうか。
BLOCKを渡すと遅延評価される、というのは納得できますが…。

同じような事がforやwhileなどにも言えますけど、あちらは構文ですよね。
0309nobodyさん2006/06/07(水) 22:43:06ID:???
ん? よくわからんけど

/e$/ は $_ =~ /e$/の略で、普通は

my @e_fruits = grep $_ =~ /e$/, @fruits;
ではなく
my @e_fruits = grep /e$/, @fruits;
って書くと思う。これ関係ない?

ちなみにgrepもmapもforのような書き方もできるぞ。
0310nobodyさん2006/06/07(水) 22:55:49ID:???
>>308
grep は最初の引数(あるいは間接オブジェクトスロット)にコードリファレンスを取る。
それは後続の引数をリスト展開して得られた最初の要素から順に $_ にセットして繰返し呼び出される。

ユーザサブルーチンのプロトタイプで言うと (&@) ね。完全に同一じゃないけれど。

>>309
grep や map を連結できるのは、それぞれが返した値を前の関数に引数として渡しているから。だから両者は全く別物。
for(each), while, if などの修飾子は引数として渡されているわけではなく、スコープを生じるブロックを持たないだけでそれぞれが元来の制御構造であることに変わりがないので。
03113082006/06/07(水) 23:03:22ID:???
>>309
わかりづらくてすいません。
例えば

$_ = 10;
my @r = map $_ * 2, (1..5);
print "@r";

と書いた時に、@r の中身は (10, 10, 10, 10, 10) じゃなくて (2, 4, 6, 8, 10) とできるのは
なぜなんでしょう?
03123082006/06/07(水) 23:06:03ID:???
リロードしてませんでした orz

>>310
ありがとうございます。スッキリしました。プロトタイプの仕業でしたか。
てことは、EXPRの場合もBLOCKの場合も、結局コードリファレンスとして渡されるわけですね。
0313nobodyさん2006/06/07(水) 23:42:47ID:???
ぐえー、難しすぎて意味がわからん。
使う分にはそこまでわからなくても問題ないけど。
0314nobodyさん2006/06/08(木) 00:11:28ID:???
>>313
思考停止はもったいないよ(´・ω・)
意味がわからなければ調べたり質問したりすればいいのに。
0315nobodyさん2006/06/08(木) 00:16:48ID:???
プロトタイプでブロックとるgrepは書けるけど式の方はできないから
やっぱり組み込み関数なのでズルしてると思ったほうがいいね。
03163082006/06/08(木) 00:33:23ID:???
>>315
そうみたいですね…。試しに map を (&@) で実装してみました。
やはり式やブロックだけでは渡せず、無名関数を作ってコードリファレンスを渡さなきゃダメみたいです。
先ほどのブログにコメント付けてきちゃいましたorz 訂正してこなきゃ・・・

sub mymap(&@) {
  my $code_ref = shift;
  my @new_list = ();
  for(@_) { push @new_list, $code_ref->(); }
  return @new_list;
}

$_ = 5;

# @r = mymap $_ * 2, (1..5);            # NG
# @r = mymap { $_ * 2 }, (1..5);        # NG
@r = mymap sub { $_ * 2 }, (1..5);      # OK

print "@r";
0317nobodyさん2006/06/08(木) 00:40:21ID:???
>>316
> やはり式やブロックだけでは渡せず、無名関数を作ってコードリファレンスを渡さなきゃダメみたいです。
おいおい。呼び出し方が間違ってるだけだよ。

× @r = mymap { $_ * 2 }, (1..5); # NG
○ @r = mymap { $_ * 2 } (1..5); # OK
03183082006/06/08(木) 00:44:04ID:???
うわ・・・orz お恥ずかしい。
という事は、式の場合だけは裏でトリックが使われてる、て事でいいのでしょうか…
0319nobodyさん2006/06/08(木) 01:04:38ID:???
>311
別に難しく考えなくても、変数のスコープが違うだけじゃん。
$_ = 10;
print map $_ * 2, (1..5);
print $_ * 2 for(1..5);
print $_;
03203082006/06/08(木) 01:20:55ID:???
>>319
「スコープが違う」というのはわかるのですが、
「なぜgrepやmapの引数に書いた時だけスコープが違うのか」がわかりませんでした。

特別な構文もなしに書いた「$_ * 2」が、mapを呼び出す時点でなぜ「20」と評価されずに
「$_ * 2」という式そのものとして渡せるのかが不思議でした。

紛らわしい書き方ですいません。質問するのは難しいですね……。
長くなってしまいました。皆様お答え頂きありがとうございました。
0321nobodyさん2006/06/08(木) 01:29:33ID:???
少なくとも初心者質問スレ向けの質問ではないなw
03222392006/06/08(木) 01:58:38ID:???
ども、昨晩お世話になった者です。

あの後も、動作確認ができたプログラムを自分の作ったページに組み込んでみるとやっぱり動かない。
試行錯誤の末、サブルーチン名に予約語を使っていたことが分かりました。
で、ようやくさっき、思い通りのページが作れました。

ということで、とことん勉強不足を痛感したわけですが、
ここでのアドバイスがあってなんとかなったもので、一言だけお礼を言いに。
特に>>251氏。ありがとうございました。
他の皆さんも参考になりました。ありがとうです。

またトラブったら泣きつきにくるかもしれませんが、その時はその時でまたよろしくです。
0323nobodyさんNGNG
$obj->func のfunc部分を変数$val='func' を使って実行できるようにしたいと
思っているのですが、eval使うぐらいしか方法はないでしょうか?
0324nobodyさん2006/06/08(木) 07:39:13ID:???
掲示板プログラムを作成しているのですが、
書き込んだり削除したりした後に、掲示板表示画面に戻ってきた際に
キャッシュされた以前の状態の画面が表示されてしまいます。
ブラウザに更新を知らせるにはどのようにするのがよいのでしょうか?
0325nobodyさん2006/06/08(木) 08:28:37ID:???
>>323
my $func = $obj->can($val) and $obj->$func();

いきなり$obj->$val()で動かなかったっけ?
0326nobodyさん2006/06/08(木) 15:06:05ID:iBH9Xn1C
新しくプログラムを作ってみるのに以下をインストールしました。
apache1.3.35 activeperl5.8.8 mysql4.0.26

DBIを使うのにppmでモジュールをインストールしました。
DBIとDBD-mysqlです。

そうしたらどうも
$sth->fetchrow_hashrefがstrict環境下ではエラーになってしまいます。
ハッシュリファレンスの値がありませんとのこと。

以前デスクトップで作ってた環境をノートパソコンに写したのですが、
モジュールのインストールが十分か不安ですが、思い出せません。

確かdata-dumperとdbiとmsql-mysql-moduluesという3つが欲しかったのですが、
ppmで見つからなかったので他のサイトで薦められてたDBD-mysqlとDBIにした覚えが
あります。というあやふやな記憶で今回もその二つを入れたのですが、
どうも動作がしませんので間違っていたかもしれません。

この二つの入れる順番などありましたでしょうか?
それとも前者の3つのモジュールを決められた順番でいれないとfetchrowが使えませんでしょうか。

アドバイス宜しくお願いします。
03273262006/06/08(木) 15:08:17ID:iBH9Xn1C
すみません。winXPにて上記をやっています。
失礼しました。
0328nobodyさん2006/06/08(木) 15:20:30ID:???
data-dumper は Data-Dumper-Simple じゃなくて?
0329nobodyさん2006/06/08(木) 15:21:25ID:???
その他のモジュールはWindowsへは対応が遅れてるとかかも
というのも、以前Encodeモジュールでエラーがあり調べてたらWinとLinux環境とでバージョンの違いが酷かったので・・・
03303262006/06/08(木) 15:33:20ID:iBH9Xn1C
>>328
http://www.rfs.jp/server/mysql/01/07.html
ここを見てperlを勉強していて、(結構前の話ですが)それでDBIもここで勉強しました。

Data-Dumper-Simpleというモジュールは過去に入れた覚えがないのですよね。
過去作っていた環境なら問題なく動いたコードなんです。

fetchrow_heshref以外は問題なく動作してるのでDBIのモジュールのインストール自体は
できてると思うんです。
さっき試しに一旦ppm unsitallしてから先にDBD-Mysqlを入れたら自動でDBIを
先にインストールされました。

モジュールのバージョンがかわってfetchrow_hashrefがダメになったのですかね。
なんでしょうか。とりあえずData-Dumper-Simpleも入れてみますね。

あ、それとstirctを外すと何故かfetchrow_hashrefは動作します。
なんですかねこの症状。
>>329
そうでしたか。
でも過去動作していたコードと考えると逆にバージョンがアップしたせいなのかもしれませんが。
0331nobodyさん2006/06/08(木) 15:41:28ID:???
formの要素に配列は使用出来るのでしょか?

たとえば
<input type="text" name="test[0]">
<input type="text" name="test[2]">
<input type="text" name="test[3]">
というフォームデータを以下のように受け取ろうと考えて
いますが上手く行きません。
use CGI;
$query = new CGI;
@test = $query->param('test');
どなたかご教授お願い致します。
03323262006/06/08(木) 15:43:30ID:iBH9Xn1C
Data-Dumper-Simpleいれてみました。
特にかわりありません。
やはりstrict環境下では$sth->fetchrow_hashrefが不正扱いされるようです。
03333262006/06/08(木) 15:45:36ID:iBH9Xn1C
>>331
それはできません。あくまでHTMLとPERLは違う言語でHTMLには配列という概念がありません。
0334nobodyさん2006/06/08(木) 15:46:14ID:???
>>331
inputタグ内の添え字は要らない。(PHPはできたかも)
あとは@test = $query->param('test'); で読めるんじゃなかったかな?
0335nobodyさん2006/06/08(木) 16:24:15ID:???
>それはできません。あくまでHTMLとPERLは違う言語でHTMLには配列という概念がありません。
そうですか・・・
input type=textを、type=checkboxのようにに同一要素名で
送信する事は出来ないのでしょうか?
・・・とおもったら
>inputタグ内の添え字は要らない。
こちらで解決しました!!
添え字無しできちんと配列データとして送られていました。
ありがとうございます。

0336nobodyさん2006/06/08(木) 16:29:01ID:???
>331
同じnameで配列の様に受け取りたいならcgi-libのReadParseを使ってみてください
たしか\0を区切り文字として渡してくるので
@array = split(/\0/, $in{'param'});
で配列にできたかと
03373262006/06/08(木) 16:37:38ID:iBH9Xn1C
>>334
知識不足ですみません。
>>335
惑わせてしまいすみませんでした。
03383262006/06/08(木) 17:00:06ID:iBH9Xn1C
for ($form{index}..($form{index}+10)){
my $dbh = DBI->connect(@$dbipass{qw/source user pass/});
my $sth = $dbh->prepare(qq|select * from order_table order by ordertime desc limit $_,1;|);
$sth->execute();
my %db_all_field = %{$sth->fetchrow_hashref};
$sth->finish;
print $_,"<br>";
}

上記を試して確認中にやっとのことで原因わかりました。
データーベースにレコードが10以下の時の対処が記述してなかったが故のkとでした。

面目ありません。
0339nobodyさん2006/06/08(木) 18:11:03ID:iBH9Xn1C
ようやく問題が解決したので本題をすすめています。

たまにチャットとかで
只今の閲覧者5人 参加者1人
っていう表示を見かけます。

あれはどうやって実現するのでしょうか。

例えばHTMLのmetaでrefleshを使って30秒毎に相手のIPを確認して
閲覧人数を割り出すのでしょうか?

相手がCGIにアクセスしてきたらIPを取って、取得時間をデータベースに入れておく。
で、1分毎にそのデータベース内のレコードを確認して取得から1分以上になっていたら
削除する。

でもイマイチな仕様ですね。これじゃ。ああ。もっといい方法があると思うのですが。
0340nobodyさん2006/06/08(木) 18:11:51ID:MZDW6IYK
すいません、変数からから指定文字列を抜いた後に
残った数値に1を足したいんですがうまくいきません

$line="hoge100";     
$line =~ s/hoge//;     
$line=$line+1;     
print $line;      何も表示されない

どこが悪いんでしょうか、お願いします。
0341nobodyさん2006/06/08(木) 18:21:17ID:???
>>339
ここはおまえの日記じゃない。
0342nobodyさんNGNG
脳味噌
0343nobodyさん2006/06/08(木) 18:43:37ID:???
>>340
とりあえず

$line='101';
print $line;

で表示されるかどうか確かめることをお勧めする。
0344nobodyさん2006/06/08(木) 19:00:59ID:???
>340
セミコロンの後ろにある全角空白を削除すれば動く
0345nobodyさん2006/06/08(木) 19:43:03ID:iBH9Xn1C
http://modskona.clash.cgiboy.com/

ここ閲覧者数がでますが、これをperlCGIで実現する方法はわかる方いますでしょうか?
0346nobodyさん2006/06/08(木) 19:52:07ID:???
来訪者がCGIを動かしてから1分以内はそこに居ると仮定する
ただこれだけですよ
0347nobodyさんNGNG
俺んとこにもついてるな
03483452006/06/08(木) 20:02:06ID:iBH9Xn1C
>>346
それで1分たったらどうするんですか?
cronとかで1分毎に削除CGIを動かすとかですか?
例えば今自分のサイトのどこに何人いるかを確認できるようにするには、
CSV形式で
1.IPアドレス
2.パスインフォ?でしたっけ
3.リクエスト時刻(秒単位)
でやって毎回誰かがアクセスしてきたらそのCSVのIPで正規表現、重複しないように更新をやって、
削除はcronで別CGIを動かして3のリクエスト時刻が既定タイムを超えてたら
削除。

1分毎にcron起動ってなんかあれですね。
訪問者が来た時に削除プログラムも動かす方がスマートですかね。

と考えてみて一応できそうですが、やり方が下手なような気もします。
指摘などありましたらお願いします
0349nobodyさんNGNG
後者で正解
03503452006/06/08(木) 20:10:23ID:iBH9Xn1C
>>349
ありがとうございます。
とりあえず徹夜で作ってみます。
強制的に訪問者に話かけることができるサイトを。
0351nobodyさん2006/06/08(木) 20:15:48ID:???
>>350
そんなサイトがあったら、怖くて二度といかなくなるような…
0352nobodyさん2006/06/08(木) 20:28:53ID:???
JライクなP使いだな。
0353nobodyさん2006/06/08(木) 21:03:01ID:???
open(FILE, ">test.dat") or die;
print FILE, @stream;
close(FILE);

みたいにして簡単に配列の中身をtest.datに書き込みたいんですが、
エラーになってしまいます。

やっぱり配列をループ回して一行ずつ書き込んでいくしかないんでしょうか。
アドバイスよろしくおねがいします。
0354nobodyさんNGNG
エラーメッセージ読めよ
コンマイラネって書いてあるだろ
0355nobodyさん2006/06/08(木) 21:08:05ID:???
エラーになるといってエラーメッセージ晒さないのはまじめに
回答を求めてないと思われてもしょうがないな...
0356nobodyさん2006/06/08(木) 21:13:05ID:???
ほんとだ、カンマ取ったらいけました
ありがとうございます。
0357nobodyさん2006/06/08(木) 21:17:23ID:???
許さんよ
0358nobodyさん2006/06/08(木) 23:57:04ID:???
htmlログなんですが2chブラウザで読み込めるようにするにはどうすればいいでしょうか?
書き込み禁止の読み込み限定にしたいんですが
0359nobodyさん2006/06/09(金) 00:01:33ID:???
>>358
日本語でおk
03603582006/06/09(金) 00:10:31ID:CHuIt143
>>359
日本語とは?
■ このスレッドは過去ログ倉庫に格納されています