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

【Perl】初心者コーナーPart9

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。01/12/28 23:21ID:SPLRvqQi
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
0102名無しさん@お腹いっぱい。02/01/09 15:11ID:yTZZpKpq
初めまして、今回仲間内のHPで出席簿を作ってみようということになって少しやってみたのですけど
まったくうまい子といきません。
やりたいことは、名前入力 名前に対してのカウント数
これくらいです。
一応ソース載せます、めちゃくちゃだと思うので一から出直せとかきついこといってください。
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
foreach $pair(split(/&/, $query)){
($name,$value)=split(/=/,$pair);
$name=$value;
}

OPEN(FILE, ">+./$name/count.dat);
$count=<FILE>;
print FILE ++$count;
close<FILE>;
OPEN(NAME, ">+./namedata.dat");
while ($check=<NAME>){
if ($check ne $query){
seek(NAME,0,2);
print NAME $query\n;}
}

####スミホマ
print"content-type: text/html\n\n";
print"<table border=\"1\">";
while($uname[$list]=<NAME>){
$data="./$uname[$list]/count.dat";
print"<tr><th>$uname[$list]</th><td>$data</td>\n";
}
print"content-type: text/html\n\n";
print"<table border=\"1\">";
foreach $key (sort keys %uname){
print"<tr><th>$key</th><td>
まだ途中です。
0103名無しさん@お腹いっぱい。02/01/09 15:29ID:???
>>102
それだとフォームからのを ほとんど読み捨てない?
あと
OPEN(hoge,">+ filename");
だと関数名が違ううえに 開いた途端ファイルが空になりそう。
http://tohoho.wakusei.ne.jp/wwwperl.htm
0104名無しさん@お腹いっぱい。02/01/09 15:33ID:yTZZpKpq
>103
ううむ、もっかいやり直して載せてみます。
頑張ります。ありがとー
0105名無しさん@お腹いっぱい。02/01/09 22:11ID:???
>>102
何を参考にしたらそんなソースになったのか知りたい。
0106名無しさん@お腹いっぱい。02/01/09 22:46ID:CEjm/hO6
perlのファイルをupすると、一行目のパスの頭になぜか<がついて
<#!/usr/bin/perl
となってしまいます。windowsからアップしているのですが、
LFでアップしようがなんだろうが<がついてしまいます。
原因わかるかたいらっしゃったら教えてくださいー
0107名無しさん@お腹いっぱい。02/01/09 22:50ID:no3DVS2q
>>106
どこに?
0108名無しさん@お腹いっぱい。02/01/10 11:13ID:6z++Gsnn
tellが取る位置が納得いかない。 毎行index化したいのですが

open(F, file) || die;
tie(%IDX, 'GDBM_FILE', file.gdbm);
$id = tell(F);
while(<F>) {
$name = $_;
 #ココ?
$IDX{$name} = $id;
$id = tell(F); #この行は
}
untie %IDX;
close F;

これはうまくいくのですが、「$id=tell(F);」を、「ココ?」に入れる方が
正しい気がしてなりません。
しかし、そうやって作ったgdbmファイルの返す結果はズレズレです。
えらい勘違いしてるのかもしれませんが、よろしくお願いします。
0109名無しさん@お腹いっぱい。02/01/10 12:20ID:???
が実行される度に次の行の始点にいくのでうまくいかなくて当然です。
0110名無しさん@お腹いっぱい。02/01/10 12:50ID:???
>>102
まったくうまい子といきません。
ワラタ
0111名無しさん@お腹いっぱい。02/01/10 13:30ID:???
>>106
鯖の問題では?
タグ埋め込もうとしてるとか
011210802/01/10 13:54ID:6z++Gsnn
>109
「ポインタは行頭にしか置かれない」と思い込んでました。アホー
前行の行末 = 次行の行頭 なんですね。
スッキリしました。ありがとうございました。
0113名無しさん@お腹いっぱい。02/01/11 13:45ID:sSwGXaK5
ttp://homepage1.nifty.com/wizman/app/perlfactory/

これ使ってる人って居ます?
0114名無しさん@お腹いっぱい。02/01/11 15:34ID:uaH1srIU
2ch書き込み補助プログラムを作ろうと思ってるんだけど,
ソース見てると出てくる
<input type=hidden name=time value=1010730193>
って何? 時間みたいだということはわかるんだけど・・・

あと,perlで書かれた2ch書き込みプログラムのサンプルが
あったらきぼんぬ
0115名無しさん@お腹いっぱい。02/01/11 15:50ID:USEv/wv3
>114
time関数で取得した書き込み時間をhidden属性で渡してると思われ。
0116名無しさん@お腹いっぱい。02/01/11 15:55ID:???
>>115
何の為に? (笑
0117名無しさん@お腹いっぱい。02/01/11 15:57ID:???
>>116 二重投稿チェック。
0118名無しさん@お腹いっぱい。02/01/11 16:01ID:???
どうやってそれでチェックするの? (^∀^)
0119名無しさん@お腹いっぱい。02/01/11 16:08ID:???
>>118 わからんなら気にするな。
0120名無しさん@お腹いっぱい。02/01/11 16:15ID:???
ごめんなさいごめんなさい
本当に困っています
教えて下さい
0121名無しさん@お腹いっぱい。02/01/11 16:26ID:USEv/wv3
わからんものはいらないんだからマネしなくていいじゃん。

>>120 = >>114 なの?
>>114でゆってる「ソース」ってブラウザ画面からとってきたやつ?
0122名無しさん@お腹いっぱい。02/01/11 16:35ID:???
そう言うアナタは解るんですね   :-)
012311402/01/11 16:37ID:uaH1srIU
>>121
あ,>>120じゃないです,けどThx.IEやネスケの「ページのソースを見る」
ってやつだとオモタ(IEもネスケも使ってないから知らん).
生timeを10進数で書いただけなのね

…あ,もしかして,これをいじると連続投稿できたりするの?
もしかして(って,そこまで杜撰じゃないか)
0124名無しさん@お腹いっぱい。02/01/11 16:43ID:???
これ何の意味も無いって、御まじない
HTMLにID埋めて判別出来なる訳ないじゃん
012512102/01/11 17:01ID:???
>122 わかりませんです。
ソース見てない作者でもない >115で書いたことくらいしかわがんねっす。
0126名無しさん@お腹いっぱい。02/01/11 17:06ID:???
>>125 実際に試してみて書き込めるかどうか試してみる
こときぼんぬ
012712102/01/11 17:18ID:???
>126 オレ?
0128名無しさん@お腹いっぱい。02/01/11 21:22ID:???
分数の計算するにはどうすれば?
0129名無しさん@お腹いっぱい。02/01/12 02:26ID:Ex/FkKTs
>>128
電卓を使いましょう。
0130名無しさん@お腹いっぱい。02/01/12 03:30ID:???
sub get_time{

$ENV{'TZ'} = 'JST-9';
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$day = ('日','月','火','水','木','金','土')[$wday];
$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d",$year+1900,$mon+1,$mday,$day,$hour,$min,$sec);

}

とあって、時間表示で秒を表示させたくないとか年を表示させたくないとか、
色々変えたいのですが初心者すぎてどうしたらいいのかわかりません。
時間表示をどういう風にカスタマイズしたらいいのか、
解説してあるサイトを教えていただけませんか?
他の所も勉強すべきなんでしょうけど、急いでいるので
とりあえず時間表示の部分だけどうしたらいいのか知りたいのです。
検索しようにも漠然としててどうしたらいいかわからないし、よろしくお願いします。
0131 02/01/12 03:52ID:H5EXwuVV
> 130
;### 時分秒・年月日・曜日を取得するなら以下で充分
($sec,$min,$hour,$mday,$mon,$year,$wday)= (localtime)[$[ .. $[+6];

;### 年および月は次のようにする
$year+= 1900; $mon++;

;### 時・分・秒・月・日は、ゼロサプレス無しにするなら次のように
;### する。(sprintf関数がオーバーヘッドは大きくてらっしゃるから)
if ( $sec < 10 ){ $sec= '0' . $sec; }
013213002/01/12 04:39ID:???
>>131
ありがとうございます…
一生懸命理解しようとしたのですがよくわかりませんでした。
どこにどうやって記述したらいいのかが…

年表示は2002年なら02にするか非表示にしたいんです。曜日表示も消したいんですが…
例えば(02/01/12/04:38)か(01/12/04:38)のようにしたい。
途中経過を無視して答えだけクレクレ厨してるようで心苦しいのですが
どう書けばいいのか丸ごと教えてくださればうれしいです。
本当にすみません。
0133名無しさん@お腹いっぱい。02/01/12 04:43ID:???
>途中経過を無視して答えだけクレクレ厨してるようで心苦しいのですが
>どう書けばいいのか丸ごと教えてくださればうれしいです。

ここはPerlのコーディングで困ってる人のスレです。
0134名無しさん@お腹いっぱい。02/01/12 04:51ID:???
スクリプト改造工房 Part3
http://pc.2ch.net/test/read.cgi/php/988808396/
0135張り直し02/01/12 04:52ID:???
スクリプト改造工房 Part3
http://pc.2ch.net/test/read.cgi/php/988808396/

「こういうふうにスクリプトを改造したいけどやりかたわかんないよー」
という人がいましたらここで聞いてください。
ひょっとしたらアドバイス出来るかもしれません。
013613002/01/12 05:18ID:???
>>133
あ、すみませんでした。
>>134-135
どうもですー。逝ってみます。
0137 02/01/12 06:11ID:h7K0q4m9
> 132

;### 年表示フラグ
$DISP= 1;          # (0:年非表示, 1:年表示)

;### 年月日・時分の取得
$get_time= &get_time;

;### 年月日・時分取得用サブルーチン
sub get_time{
  my( $min, $hur, $day, $mon, $year )= (localtime)[$[+1 .. $[+5];
  $year+= 1900; $mon++;
  if ( $min < 10 ){ $min= '0' . $min; }
  if ( $hur < 10 ){ $hur= '0' . $hur; }
  if ( $day < 10 ){ $day= '0' . $day; }
  if ( $mon < 10 ){ $mon= '0' . $mon; }
  $year= $DISP ? substr($year, -2, 2).'/' : '';
  "$year$mon/$day/$hur:$min";
}
0138 02/01/12 06:29ID:gr/TbQbq
> 137

補足しておきますが、字下げのために全角スペースを使用していますので、
コピペする場合は半角スペースに書き替えてください。
0139名無しさん@お腹いっぱい。02/01/12 07:12ID:???
>>137-138
ご丁寧にありがとうございます…
スペースを半角にしてそのままコピペしましたが、
でもそれでやると、[]となって一つも表示されません…
素直に改造スレへ逝って来た方がよさそうです…
0140 02/01/12 07:30ID:8mAO1za5
> 139

これをやっても表示されないとなると困ったことですね。
念のため次の実行でワーニングが出るかどうか試してみては?
perl -wc xxx.pl
0141名無しさん@お腹いっぱい。02/01/12 08:31ID:???
(月/日 時:分)なら
sub get_time{

$ENV{'TZ'} = 'JST-9';
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$date = sprintf("%02d/%02d %02d:%02d",$mon+1,$mday,$hour,$min);

}
0142名無しさん@お腹いっぱい。02/01/12 10:04ID:???
>>140-141
やっとわかりました!
希望通りにできました。
色々と変える変更も好きなようにできました。
脱線話題なのにつきあってくださって教えてくださって本当に感謝します、
ありがとうございました。
0143名無しさん@お腹いっぱい。02/01/12 22:55ID:WkPCmc4x
perl言語をわかり易ーく説明しているサイトを教えてください。
それと、CGI作る際に覚えといたほうがいい言語って何ですか?perlは駄目??
0144名無しさん@お腹いっぱい。02/01/12 23:24ID:???
>>143
とほほとか。
CGIはPerlでもいいけどPHPの方が簡単だと噂
0145ム板の住人02/01/13 03:44ID:XUMgdFRP
>>143
ちゃんと削除依頼も出していたみたいやから、えらいね。
144がいう。とほほはここ。
http://tohoho.wakusei.ne.jp/wwwperl.htm
PHPもいいけど、RubyができるならeRubyでもいいかも。
言語として簡単と言うより、PHPやeRubyはCGIを作るのが簡単。
CGIはPerlが一番資料があると思うけど、
配布されているPerlのCGIのソース見るとわかるように、
ほとんど暗号だから。
保守性やOOで組みたいなら、PythonやRubyを使った方がいいかもね。
0146初心者02/01/13 04:52ID:DlteyoA5
あのーAN HTTPD Daemonを使って
CGIを使いたいのですが
自分で色々やってみたんですがどうしてもできませんでした
やったことはActive PerlとJperlをInstallして
落としてきた掲示板CGIにそのパスを書いたんですが
FTPからそのCGIの属性変更をしようとしても変更できず
HTTP 500内部サーバエラーが出てできませんでした
どなたか詳しく教えていただけませんか?
0147名無しさん@お腹いっぱい。02/01/13 04:54ID:H4tslrXd
悪ロダみたいな掲示板のスクリプトを探しています

テキストファイルやMIDIファイルを主に扱いたいのですが
JPEGファイルだけでなくいろいろな形式のファイルを
アップロードできる掲示板のスクリプトで
デファクトスタンダードっぽい有名なものとかあるのでしょうか?
イメージ掲示板にはどこに行ってもこれと同じのを使っているなぁという
有名なのがあるみたいですが
0148名無しさん@お腹いっぱい。02/01/13 04:54ID:34eWZDO9
>>146
ネタだろ?
0149名無しさん@お腹いっぱい。02/01/13 04:56ID:???
>>147
http://www.google.co.jp/search?hl=ja&q=%83A%83b%83v%83%8D%81%5B%83_+cgi%81@%83t%83%8A%81%5B&lr=
これでもくらえ。
0150名無しさん@お腹いっぱい。02/01/13 05:07ID:H4tslrXd
おおおおお!喰らった816件!

おれも「アップローダー」&「CGI」&「フリー」&「配布」で
検索して同じように膨大な結果になったんですけど

無難なとこで、みんなが使っている有名なやつにしたいなぁなんて

ダメっすか?(^^;
0151名無しさん@お腹いっぱい。02/01/13 05:39ID:???
試験
0152初心者02/01/13 06:14ID:DlteyoA5
僕はネタと思われるほどおかしい事をやっているのでしょうか
ここでこんな事を聞くのはお門違いなのでしょうか
0153名無しさん@お腹いっぱい。02/01/13 06:17ID:9ZeVW+fZ
>>152
いちいち反応しないでじっくり待ってみなよ。
0154名無しさん@お腹いっぱい。02/01/13 06:53ID:???
>>146
属性とは何か。パーミッションとは何か。
調べれば自ずと答えが見つかる気がする。
あとはhttpdのヘルプでも読んでくれ。

要するにPerlの問題じゃないって事。
0155名無しさん@お腹いっぱい。02/01/13 07:14ID:rQlmrkvV
test
0156名無しさん@お腹いっぱい。02/01/13 07:34ID:Wnlhf2ri
2ちゃんねらーの多く出入りする掲示板を運営しています。
掲示板にトリップ機能を組み込みたいんですが、誰かわかりますか?
0157名無しさん@お腹いっぱい。02/01/13 07:49ID:???
>>156
みちのくんとこにある2ちゃんコピーの掲示板についてる。
0158名無しさん@お腹いっぱい。02/01/13 11:31ID:0YPd0etQ
requireとサーバーの負担について質問です。

#!/usr/bin/perl

print "Content-type:text/html\n\n";

require "a.cgi";
print $tmp;
require "b.cgi";
print $tmp;
require "a.cgi";
print $tmp;

exit;

a.cgiには $tmp="a";
b.cgiには $tmp="b";
と書いてあります。

と書くと、結果はabaとしたいのですが、abbとなるんです。
3回目のrequireが1回目と同じために3回目の処理を勝手にスキップ
してるのではないかと推測してみたんですがあってますでしょうか。

別の案として、
require "a.cgi";
$tmpa=$tmp;
require "b.cgi";
$tmpb=$tmp;
print "$tmpa$tmpb$tmpa";

と考えたんですが、a.cgi b.cgiは本来40個くらい変数格納していて、
全て変数に取っとくのもどうかと思い最初の案を考えたのですが。

日本語が不鮮明だな…。まとめてみると、
「2度目のrequireを有効にすることができるか、できるならその方法」
「別の案の場合、サーバーに掛かる負担ってのは憂慮するほどのものであるか」
の二点が疑問です。

どなたかご教授頂ければ幸いです。
0159名無しさん@お腹いっぱい。02/01/13 11:49ID:???
>>158
それは、requireの仕様。
# てか、requireの使い方を激しく勘違いしているような、、、
とりあえず、perldoc -f requireしてみること!
158の知りたいことが全て解説されている。
016015802/01/13 11:53ID:0YPd0etQ
どうも有難う御座います。
requireの使い方は人のCGIを見て使い方を自分の中で勝手に認識したので…。

perldoc -f requireやってみます。
というかどこで(?)やればいいのかも解らないのでとりあえず調べてきます。

それでは。
0161 02/01/13 12:09ID:???
>>160
> というかどこで(?)やればいいのかも解らないので
コマンドラインから
0162名無しさん@お腹いっぱい。02/01/13 13:35ID:2oX90M6u
lolipop.jpの鯖にapeboard+を置いたんですけど、
505で動きません。
アスキーモードで転送したし、
Perlのパスは指定のものに変更したし、
パーミッションも755にしているのに動きません。
何故かしらー??
どころか、テストのために同じ状態でUPした、
Hello World!クラスのcgiも動かないのです。
鯖が悪いのか?FTPソフト(FFFTP)が悪いのか?
お分かりの方おりましたらお教えください。
0163名無しさん@お腹いっぱい。02/01/13 13:48ID:???
POSIXモジュールを使っている人はいる?
使いまくると見づらい?
例えば、$ENV{'QUERY_STRING'}を参照すればいいものをPOSIX::getenv("QUERY_STRING")とやるということ。
0164名無しさん@お腹いっぱい。02/01/13 15:45ID:???
>>162
Perlのエラーログ見ました?
0165名無しさん@お腹いっぱい。02/01/13 15:53ID:iK+xIF0s
>>164
httpdのログだろ?
0166名無しさん@お腹いっぱい。02/01/13 15:57ID:???
るせヴォケ
0167名無しさん@お腹いっぱい。02/01/13 16:06ID:???
>>166
横から煽るな。
0168名無しさん@お腹いっぱい。02/01/13 16:14ID:???
>>162
CGIだけど、なんか質問ある?Part 5
http://pc.2ch.net/test/read.cgi/php/1009331505/
016915602/01/13 19:36ID:ZxK7891W
すいません、>>157のみちのくの意味がわかりません。
もしよろしければ、もう少し詳しいことを教えてください。
0170名無しさん@お腹いっぱい。02/01/13 20:05ID:???
>>169
http://www.google.co.jp/search?q=%82%DD%82%BF%82%CC%82%AD%81@%8Cf%8E%A6%94%C2%81@cgi&hl=ja&lr=
017115602/01/13 21:05ID:ZxK7891W
>>170
申し訳ない。わざわざ有難うございます。
0172名無しウィルス ◆UETvirus 02/01/13 21:26ID:hUoFkGoF
2ch猛威を振るう宣伝業者の書き込みを撲滅すべく活動し
ております。Q2接続プログラムの解析、関係団体へのメール等、ランキングクリックに
よる宣伝業者へのアクセス数減少と人手はまだまだ必要です。
WEBプログラム板の皆さんの技術を貸していただけないでしょうか。

下記のスレをご覧の上で、ご協力戴ければ幸いです。
「■ 悪徳宣伝業者の画像や動画をばらまくスレ2 ■」
http://wow.bbspink.com/test/read.cgi/ascii/1010876229/
0173名無しさん@お腹いっぱい。02/01/14 15:38ID:xszmZ/SM
Perlでfork関数を使用した際、
子プロセスがいくつ生成されているか、
親プロセスが知るにはどうすれば良いのでしょうか?
具体的にはHTTPのGETをしたりするスクリプトで
子プロセスの数を(例えば3個までとかに)制限したい
ということなんですけど。
0174perl初心者02/01/14 19:00ID:n0YvEQb/
現在perlを始めたばかりのプログラミング初心者です。
HC Editorというフリーのテキストエディエターで
perlを書いているんですが、保存時の漢字コードをEUCにすると
なぜか保存して、再び読み出したときに中身が文字化けしてます・・・
OSはWINDOWSです、よろしくお願いします。
0175名無しさん@お腹いっぱい。02/01/14 19:05ID:???
>174
なぜその製作者のサイトで聞かない?
それが一番確実なはずだけど。
0176 02/01/14 19:48ID:???
>>174
全然Perlと関係ないぞ、それ
0177perl初心者02/01/14 20:10ID:RxHccNR/
そっか(汗
そーします。
0178名無しさん@お腹いっぱい。02/01/14 23:46ID:zLD178tU
パッケージ関数bar を標準で入っている関数die の別名として使おうとして
package foo;
*bar = \&CORE::die;
bar("hoge");
と書いてみましたが,そんな関数知らんと怒られてうまくいきません。
どうやればできますか?
0179名無しさん@お腹いっぱい。02/01/14 23:57ID:x1aEi06n
スレ違いだけど妥当なスレが見当たらなかったので
書き込ませてください。
CGIかうんた設置を試みてるのですが、どうもうまくいきません。
FFFTPを最近使い始めたのですが、転送する前・・・つまり
こちら側にあるファイルのサイズと、鯖に転送したファイルのサイズが
微妙に違うのです。
20000バイトなら、鯖のは19621バイトといったふうに。
こういうのって、CGIの誤作動に繋がりますか?
何度転送してもそのようなサイズになってしまいます。
0180 02/01/15 00:09ID:???
>>179
もしかして広告とか?

でも、やっぱりここで訊くのは間違ってる
0181名無しさん@お腹いっぱい。02/01/15 00:11ID:???
>>179
それはFTP転送がASCIIモードだと改行コード変換が行われるから(多分)。
WindowsだとCR/LFで改行だけど、他のOSだとLFだけだったり。
つまり、改行一つにつき1バイト分、サイズが少なくなる勘定。

ちなみにCGI関係は
http://pc.2ch.net/test/read.cgi/php/1009331505/
0182名無しさん@お腹いっぱい。02/01/15 00:11ID:???
お邪魔してしまってすみませんでした<(__)>
他の板で聞いてみます

広告とは?
>>179
0183 02/01/15 00:16ID:???
>>182
> 広告とは?
ゴメソ。適当に言っただけ。忘れて下さい。
0184名無しさん@お腹いっぱい。02/01/15 08:49ID:DyvaVHMP
このリファレンスの使い方って、マズいですか?
(sub内のmyな変数のリファレンスを返却)

sub foo {
my %ret;
$ret{"bar"} = "baz";
\%ret;
}

my $r = &foo();
print $$r{"bar"} . "\n";
0185名無しさん@お腹いっぱい。02/01/15 10:28ID:mJdfZzdE
>184
結果はどうなの?
最後の一行を
print $r->{"bar"}."\n";
でどうよ。
0186名無しさん@お腹いっぱい。02/01/15 11:29ID:???
( ´ ・∀・`) へー
018718502/01/15 13:37ID:mJdfZzdE
>184
なんだ。そのままで動くやん。
「sub内でのmy変数のリファレンスを返す」こと自体は全然マズくないよ。
018818402/01/15 15:41ID:DyvaVHMP
>187
>「sub内でのmy変数のリファレンスを返す」こと自体は全然マズくないよ。
ああ、そうなんだ。ありがとう。
0189名無しさん@お腹いっぱい。02/01/16 02:09ID:JQVH7PKS
ふーむ。sub呼ぶ度にheapに%retが確保されるようなイメージですかね。

sub foo {
my ($k, $v) = @_;
my %ret;
$ret{$k} = $v;
\%ret;
}

my $r1 = &foo('key1', 'var1');
print $r1 . "\n";
print $$r1{"key1"} . "\n";

my $r2 = &foo('key2', 'var2');
print $r2 . "\n";
print $$r2{"key2"} . "\n";

print $r1 . "\n";
print $$r1{"key2"} . "\n";

$ ./x.pl
HASH(0x8105ce4)
var1
HASH(0x80f857c)
var2
HASH(0x8105ce4)

$
0190102再びです。02/01/16 10:23ID:MJHKAqJj
どうも、以前にも質問しました。
時間が空いたのでもう一度書き直してみましたが、動作しません。
出席簿みたいな感じのCGIです、
少しチェックして欲しいです。


require'jcode.pl';
require'cgi-lib.pl';

&ReadParse(*answer);

$name="$answer{'name'}";

open(DATA,">>./log.dat");
while(@dname=<DATA>){
foreach $key(@dname){
($namelist,$count)=split(/,/,$key);
if($namelist eq $name){
++$count;
}
}
print DATA "$name,$count";
0191102再びです。02/01/16 10:24ID:MJHKAqJj
>>102 です。
0192名無しさん@お腹いっぱい。02/01/16 10:52ID:???
openの後が意味不明、何がしたいのか説明してみてくれる?
0193102再びです。02/01/16 10:57ID:MJHKAqJj
(名前、カウント数)
でデータを保存したいのです。
それを参照して同じ名前があったらカウント数増加、
なかったら新規で作成という感じにしたいのです。
0194名無しさん@お腹いっぱい。02/01/16 11:04ID:???
>open(DATA,">>./log.dat");
追記モードで開いてもポインタがファイルの終端を指しているから
データの読み込みは無理。
SEEKするか?

>while(@dname=<DATA>){
↑これは
>@dname = <DATA>;
こうするか
>while(<DATA>){
こうしなさい。
どちらにしても、追記モードでオープンしてるんじゃ無理。
0195102再びです。02/01/16 11:08ID:MJHKAqJj
おぉ、分かりました。
open(DATA,"+>./log.dat");
にして入出力用にすればいいのかな
もうちょっとのところまできてるんでしょうか?
とりあえずもうちょっと修行します。
また、報告させていただきます。
0196名無しさん@お腹いっぱい。02/01/16 11:11ID:???
>SEEKするか?
( ´ ・∀・`) へー
0197名無しさん@お腹いっぱい。02/01/16 11:16ID:???
>196
追記モードだとSEEKでも前に戻れなかったね。
スマソ。

>195
とりあえず書いてみろよ。
ローカルでテストする分には誰も文句言わないから。
0198超初心者02/01/16 12:10ID:zfCnc17S
Grepについて教えてください

open IN, "highschool.csv";
while ($line = <IN>){
if ($line eq '') { print "(空行)<hr>\n"; next;}
@splited = split (/\n/, $line);
$test = @splited;
@test = grep (/東京/, @splited);
print "@test<hr>\n";
}
close IN;
とhighschool.csvを読んで「東京」というキーワードでGrepかけ、検索結果を<HR>つきで表示させたいのですが
マッチしなかったところにも<HR>がついちゃいます。どのように回避するのかお教えください、
0199名無しさん@お腹いっぱい。02/01/16 12:16ID:???
@splited = split (/\n/, $line);
これが何やってるかが分からないから
その後も何やってるかが分からない
@splited に何を入れたいんだろう・・・
0200名無しさん@お腹いっぱい。02/01/16 12:25ID:???
open (IN, "highschool.csv");
while (<IN>) {
if ($_ eq "") {
print "空行<hr>";
} elsif (index($_, "東京") >= 0) {
print $_, "<hr>";
}
}
close (IN);
0201超初心者02/01/16 12:38ID:zfCnc17S
>>199
一応読んだcsvを改行コードで区切って@に入れてるんですが。間違ってますか?
それと198で訂正がありましたすみません
open IN, "highschool.csv";
while ($line = <IN>){
if ($line eq '') { print "(空行)<hr>\n"; next;}
@splitted = split (/\n/, $line);
@test = grep (/東京/, @splitted);
print "@test<hr>\n";
}
close IN;
■ このスレッドは過去ログ倉庫に格納されています