【Perl】初心者コーナーPart9
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
01/12/28 23:21ID:SPLRvqQi1:自分はこう言う事がしたい。
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を見よう。
0186名無しさん@お腹いっぱい。
02/01/15 11:29ID:???0187185
02/01/15 13:37ID:mJdfZzdEなんだ。そのままで動くやん。
「sub内でのmy変数のリファレンスを返す」こと自体は全然マズくないよ。
0188184
02/01/15 15:41ID:DyvaVHMP>「sub内でのmy変数のリファレンスを返す」こと自体は全然マズくないよ。
ああ、そうなんだ。ありがとう。
0189名無しさん@お腹いっぱい。
02/01/16 02:09ID:JQVH7PKSsub 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:MJHKAqJj0192名無しさん@お腹いっぱい。
02/01/16 10:52ID:???0193102再びです。
02/01/16 10:57ID:MJHKAqJjでデータを保存したいのです。
それを参照して同じ名前があったらカウント数増加、
なかったら新規で作成という感じにしたいのです。
0194名無しさん@お腹いっぱい。
02/01/16 11:04ID:???追記モードで開いてもポインタがファイルの終端を指しているから
データの読み込みは無理。
SEEKするか?
>while(@dname=<DATA>){
↑これは
>@dname = <DATA>;
こうするか
>while(<DATA>){
こうしなさい。
どちらにしても、追記モードでオープンしてるんじゃ無理。
0195102再びです。
02/01/16 11:08ID:MJHKAqJjopen(DATA,"+>./log.dat");
にして入出力用にすればいいのかな
もうちょっとのところまできてるんでしょうか?
とりあえずもうちょっと修行します。
また、報告させていただきます。
0196名無しさん@お腹いっぱい。
02/01/16 11:11ID:???( ´ ・∀・`) へー
0197名無しさん@お腹いっぱい。
02/01/16 11:16ID:???追記モードだとSEEKでも前に戻れなかったね。
スマソ。
>195
とりあえず書いてみろよ。
ローカルでテストする分には誰も文句言わないから。
0198超初心者
02/01/16 12:10ID:zfCnc17Sopen 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 に何を入れたいんだろう・・・
0200名無しさん@お腹いっぱい。
02/01/16 12:25ID:???while (<IN>) {
if ($_ eq "") {
print "空行<hr>";
} elsif (index($_, "東京") >= 0) {
print $_, "<hr>";
}
}
close (IN);
0201超初心者
02/01/16 12:38ID:zfCnc17S一応読んだ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;
0202名無しさん@お腹いっぱい。
02/01/16 12:45ID:???一行ずつ読み込んで、改行マークでsplitしたって、全文が$test[0]に入るだけでしょ?
csvファイルの区切り文字って\nでしたっけ?
0203超初心者
02/01/16 12:52ID:zfCnc17Sいえこの時点でカンマで区切る必要はなく、改行で区切る必要があったんです。
0204名無しさん@お腹いっぱい。
02/01/16 12:58ID:???これはなにをしてる所?
俺は「ファイルから1行ずつ呼び出す」ものだと思ってるんだが。
つまり\nが二つ以上ある可能性はないのだけれどね。
0205名無しさん@お腹いっぱい。
02/01/16 13:01ID:???while ($line = <IN>){
$c++;
print qq($c行目 $line\n);
@splitted = split (/\n/, $line);
foreach $i(0 .. $#splitted){
print qq($c行目$i個目の要素 $splitted[$i]\n);
}
}
close IN;
とりあえずこれを実行してみて何が起きているか考えてみてくださいな。
0206名無しさん@お腹いっぱい。
02/01/16 13:02ID:???0207超初心者
02/01/16 13:15ID:zfCnc17S>>200さんのアドバイスでできました。
ホントお恥ずかしい・・・
という62文字を使って 1 (あるいは 0)から ZZZZZZZZ までの
62進数を順番に生成したいのですが、上手にやる方法はありますか?
0209名無しさん@お腹いっぱい。
02/01/16 20:36ID:???0210名無しさん@お腹いっぱい。
02/01/16 20:41ID:???0211名無しさん@お腹いっぱい。
02/01/16 21:30ID:???生成した数値(文字列)をどうしたいのか
配列に入れると218340105584895個要素が居るがそれでも良いのか
つーか41で分からんの?
0212名無しさん@お腹いっぱい。
02/01/16 22:55ID:iUy26tny0213名無しさん@お腹いっぱい。
02/01/17 02:36ID:???簡単過ぎ
@char= ('0'..'9','a'..'z','A'..'Z');
for $char ( @char ){
print &xxx($char),"\n";
}
sub xxx{
my( $ret, $flg );
for ( reverse split(//, $_[$[]) ){
unless ( $flg ){
if ( $_ eq 'Z' ){
$_= '0';
}
else {
if ( $_ eq '9' ){ $_= 'a'; }
elsif ( $_ eq 'z' ){ $_= 'A'; }
else { $_++ ; }
$flg= 1;
}
}
$ret= $_ . $ret;
}
$flg ? $ret : "1$ret";
}
0214名無しさん@お腹いっぱい。
02/01/17 02:41ID:EnQVX8GIと
$foo->hoge;
は、上がハッシュだとして、下のは何を表すんでしょうか?
0215名無しさん@お腹いっぱい。
02/01/17 02:50ID:???0216214
02/01/17 02:55ID:EnQVX8GI0217名無しさん@お腹いっぱい。
02/01/18 02:21ID:/Sq0HWtq0218名無しさん@お腹いっぱい。
02/01/18 02:24ID:???0219名無しさん@お腹いっぱい。
02/01/18 12:15ID:/Sq0HWtq試しに「for」と「while」のベンチマークをしてみたところ
やや「while」の方が効率がいいようですね。<読み込むスクリプトでは
まだ簡単なスクリプトでしか試してないので、分かりませんが。
0220名無しさん@お腹いっぱい。
02/01/18 13:09ID:mZLIoXNkmy $query = $ENV{'QUERY_STRING'};
Win用のアパッチでテストした時は良かったんです。
理由を教えていただけませんか
0221名無しさん@お腹いっぱい。
02/01/18 13:17ID:???myを外そう
0222220
02/01/18 13:22ID:mZLIoXNkPerlが腐ってるんですね。
感謝
0223名無しさん@お腹いっぱい。
02/01/18 15:03ID:???解説希望。うちだとエラー起きないから、何処が腐ってるのかわかんない・・・
0225名無しさん@お腹いっぱい。
02/01/18 17:07ID:???ということで>224に同意。
0226223
02/01/18 17:21ID:???0227名無しさん@お腹いっぱい。
02/01/18 18:49ID:???0228名無しさん@お腹いっぱい。
02/01/18 19:10ID:6q/Kp0dNそれで、できたplファイルとshtmlを同じ階層に入れて、
shtmlをブラウザ(IE6.0)で開いて確認しようと思ったんですが、
開けないんです。どーしたらいいんでしょーか。
スクリプトは間違ってないと思うんですが。。。
0229 ◆efPZis9A
02/01/18 19:29ID:y3hRDyTH0230228
02/01/18 19:34ID:6q/Kp0dNApache起動して、ローカルでテストしてます。
ブラウザの右下にある青いバーが
増えていってるだけで画面は何も変わりません。
0231名無しさん@お腹いっぱい。
02/01/18 20:11ID:TBZ1H2T9別の方法があるのでしょうか。
0232名無しさん@お腹いっぱい。
02/01/18 20:35ID:???アクセスカウンターが無限ループしてるとかじゃないの?
>231
\?で大丈夫のはずだよ。
念の為にローカルで試してもみたけど、普通に出来た。
その前後の文に問題があるんじゃないのかな?
0233名無しさん@お腹いっぱい。
02/01/18 21:06ID:???無限ループは無いと思います。サンプルファイルでもやってみました。
アドレスに、
127.0.0.1/*.shtmlとやってますが、白いまんま。
shtmlをhtmlにかえると表示はされるのですが、スクリプトは動かないです。
shtmlのアイコンは、IEのアイコンにならないの?
0234名無しさん@お腹いっぱい。
02/01/18 21:08ID:???そのカウンタを直接呼び出したら?
てゆーか、ApacheのSSIの設定が通ってないとかは?
アイコン変える方法は、ファイルの関連付けでしょう。
0235232
02/01/18 21:18ID:???原因は、本に誤りがあったようです。ホームページで確認しました。
<!--#exec cmd="*.pl"-->
を
<!--#exec cgi="*.cgi"-->
に変えろということでした。変えたところ、上手くいきました。
どうもありがとうございました。
0236名無しさん@お腹いっぱい。
02/01/18 23:49ID:vKcOvEew例えば2002年1月1日の曜日を知りたい場合、以下の式で分かるのですが、なぜこ
れだけで分かるのでしょう?
($year + ($year-1)/4 - ($year-1)/100 + ($year-1)/400) % 7
上の式で出た余りを対応させれば2002年の最初の日の曜日が出ますが、これだけ
でなぜそうなるのか全く分かりません。
また、
$i = ($year + ($year-1)/4 - ($year-1)/100 + ($year-1)/400);
とした上で、
2002年4月1日の曜日を知りたい場合はその前の月(1月から3月まで)の日の合計
(31+28+31)を$iに足して7で割り余りを出すと出て来ます。
($i+(31+28+31)) % 7
でもこの仕組みが良く分かりません。そもそもなぜ年だけで、任意の年の最初の
日の曜日が分かるのか、また、それをもとにしてどうして任意の年の任意の月の
最初の曜日まで分かるのか全く分かりません。
どなたか説明をお願いできますか。
0237名無しさん@お腹いっぱい。
02/01/19 00:07ID:???Zellerの公式で検索してみて
ここに、日付け絡みのサンプルが色々出てるから必読
他にも役に立つしね
http://www.din.or.jp/~ohzaki/perl.htm
0238名無しさん@お腹いっぱい。
02/01/19 01:59ID:tDZ3djB8win98に、間違ってwinNTのPerlをインストールしてしまったんですが、
アンインストールはどうすればいいのでしょうか???
C:を「Perl」とか「NT」で探したら、Temporaryフォルダにしか
ないみたいなんで大丈夫かな?と思ったんですが、
インストーラーをもう一回起動させたら、
『指定されたサービスはすでに存在します』
ってエラーメッセージが!!!!
『アプリケーションの追加と削除』には、何もできてません。
どなたかお助けーーーー!
0239agege
02/01/19 05:21ID:???C:がダメならD:があるさ
0240Tupple3d
02/01/19 05:30ID:tSYJ2BTR$a = 1;
$a = $a++;
Perlで$aの値はどうなりますか?
0241agege
02/01/19 06:00ID:???「すんまそん」って、出だしから寒すぎて手がかじかんでうまく答えがかけないよー。
どうしよー。
0243名無しさん@お腹いっぱい。
02/01/19 06:34ID:???$a = $a++; # $aは 1
$a = ++$a; # $aは 2
0244名無しさん@お腹いっぱい。
02/01/19 07:06ID:tDZ3djB80245名無しさん@お腹いっぱい。
02/01/19 07:21ID:???おめでとう
0246名無しさん@お腹いっぱい。
02/01/19 15:46ID:b2nTXpDvFlashからデータをPOSTで送信しようとすると、
データが渡ってないようです。
GETだとちゃんとわたってます。
cgiはこんな感じです。(一部ですが)
#フォームデータの取得
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN,$query,$ENV{'CONTENT_LENGTH'});
}
else{
$query=$ENV{'QUERY_STRING'};
}
0247初心者
02/01/20 06:05ID:+Bzlb+s3サブルーチンの定義のところで
sub FormThList($;$)
{
処理・・・
}
という部分をいくつも見かけます
引数にある" $;$ " という部分は何をあらわしているのでしょうか?
自分で書籍やWebを調べてみたりしたのですが、引数なのか、リフ
ァレンスなのか、それとも他のものなのか、さっぱりわかりませんでした。
どなたかお分かりの方ご教授ください。宜しくお願いいたします。
0248名無しさん@お腹いっぱい。
02/01/20 15:18ID:GAoGOGYW0249
02/01/20 17:22ID:xUMdAd4Xほら、あれもってきて。って、よく、彼女とかにいってるでしょ。
そのあれ。だよ。
0250名無しさん@お腹いっぱい。
02/01/20 17:58ID:???引数の形式を指定してる。
$はスカラー。;以降は省略可。 ほかにもいろいろ指定できる。
詳しくはperldoc perlsubか,プログラミングPerl改訂版133Pを参照のこと。
0251名無し
02/01/20 21:19ID:Nggbj65w$dir = ''; # 指定ディレクトリ
$file = '.html'; # 検索対象ファイルの拡張子
$key = ''; # キーワード
opendir(DIR,$dir);
@files = readdir(DIR);
closedir(DIR);
foreach (@files){
if(/$file$/){
open(FILE,"$dir/$_");
@data = <FILE>;
close(FILE);
foreach (@data){
$seach = $seach . $_;
}
if($seach =~ /$key/i){
push(@list,$_);
}
}
}
foreach (@list){
print;
print "\n";
}
0252名無しさん@お腹いっぱい。
02/01/20 21:26ID:???URLデコードをしてないとか。
「ー」が含まれてるとか。
余談だけど無駄が多いからもうちょっとシェイプアップした方がいい。
grep使うとか。
0253名無しさん@お腹いっぱい。
02/01/20 23:36ID:9LP6jm+wEUCの場合
$EUC_JP = '(?:[\x00-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])';
if $seach =~ /^$EUC_JP*$key/i {
...
perlメモだかに、詳しく載ってた気がする。
0254agege
02/01/21 03:26ID:???それにしてもサブルーチンに引数の形式を指定するメリットがわかんないんだけど、
どういうことYO!
単に引数形式を明確にするだけのこと?
うーん!こんやも眠れない。
0255名無しさん@お腹いっぱい。
02/01/21 03:31ID:???眠れないんだったらperlsub読みなよ。
どういうときに使うのか書いてある。
0256名無しさん@お腹いっぱい。
02/01/21 03:39ID:???逝っちゃってますねもう
0257agege
02/01/21 03:47ID:???なるほど、漏れが異常なのか。チョットだけ安心しました。
255さんの提案でperlsub読んでだいたいはわかりました。
それにしても今までラクダ本しか読んでなっかったからバージョンアップに伴う追加・更新部分は
未知な部分が多いネー。
0258あうあうあう
02/01/21 07:42ID:???日本語部分は(メッセージなど)EUCで書くのが正解と聞きました。
ところが、DOSプロンプトだとEUCは文字化けします。
Shift-JISで書けば、DOS上では問題ないですが・・・。
どうしたらよいですか?
print "日本語いーゆーしーだ!";
とかでやると
ニ・ワク・、。シ、譯シ、キ。シ、タ。ェ
になります。
0259名無しさん@お腹いっぱい。
02/01/21 09:52ID:yXZYknLAS-JISで全然問題ない。
0260名無しさん@お腹いっぱい。
02/01/21 12:43ID:O1LRho5n以降のデータが受取れません。
流れとしては、HTMLフォームから入力して送信ボタン→確認画面で送信ボタン→メール送信
というもので、確認画面ではスペースはちゃんと入ってて、例えば「山田 まさし」
と入るのですが、その確認画面から「送信」ボタンを押して再度同じCGIを呼びだして
データを受取ると「山田」で切れてしまうです。
$value =~ tr/+/ /;この行で送られてきたスペースコード(+)をスペースに変えて
いるのですが、再送信するときには変換されたスペースをまた(+)のようなコードに
戻してあげないとダメなんでしょうか?
試しに普通の+に戻してみたらそのまま+が出てきてしまいました。。
わかりづらくてゴメナサイ、アドバイス貰えればありがたいです。
0261aaa
02/01/21 13:36ID:7eJzqhDPありませんでした。(elements programming with Perlです。)
5.5?やってから5.6本やってもおそくないですか?
あと、支障とかないですか?
0262茶文字 ◆xELvisFU
02/01/21 15:57ID:0ovwchs4open FILE,"xxx.dat";
@page = split(/\n/,<FILE>);
print <<"EOH";
<html>
<head>
<title>$page[0]</title>
</head>
<body>
<h1>$page[0]</h1>
<h2>$page[1]</h2>
EOH
$count = 0;
foreach $i(@page){
if ($count > 1){
print $page[$i];
}
}
print "</body></html>";
close FILE;
2行目を$page[1]として<h2>に、3行目以降をforeachで順に出力するつもりで
以上のように書いたのですが、$page[2]以降を取得できないようです。
どこで勘違いしているのでしょうか?
0263名無しさん@お腹いっぱい。
02/01/21 16:08ID:???>foreach $i(@page){
ここに問題がある。
この場合、$iには何が入るのかな?
俺は数字じゃないように思えるんだが。
>foreach $i(1 .. $#page){
との違いはわかるかな?
0264名無しさん@お腹いっぱい。
02/01/21 16:09ID:???こっちが正しいな。
修正する前に書き込んじまった、スマソ。
あともう一つ質問。
$countはずっと0のままでいいのかな?
数字が全然増えてないから、if文の中に入れないようにも見えるぞ。
0266251
02/01/21 16:17ID:???逝ってきます。
0267茶文字 ◆xELvisFU
02/01/21 16:21ID:???をっとスマソ
うまくいかないので別の方法で無理やり辻褄あわせてて、もとのスクリプトと
違うこと書いちゃいました。
$count++をforeachの最後に入れて、print $page[$count];にしてたはず・・・
うがー なんでこんなところにひっかかってんだ私;
0268名無しさん@お腹いっぱい。
02/01/21 16:25ID:yxhIL91Y俺ならこんな感じ。チェックしてない。
open (FILE,"xxx.dat"); @page = (<FILE>); close (FILE);
$page[0] =~ s/\n//g;
$page[1] =~ s/\n//g;
print <<"EOH";
Content-type: text/html; charset=Shift_JIS
<html>
<head>
<title>$page[0]</title>
</head>
<body>
<h1>$page[0]</h1>
<h2>$page[1]</h2>
EOH
$count = @page;
for($i = 2;$i <= $count; ++$i) {
$$page[$i] =~ s/\n/<BR>\n/g;
print $page[$i];
}
print "</body></html>";
0269名無しさん@お腹いっぱい。
02/01/21 16:26ID:yxhIL91Yミス
>$$page[$i] =~ s/\n/<BR>\n/g;
$一個おおいっすスマソ
0270名無しさん@お腹いっぱい。
02/01/21 16:28ID:???print "Content-Type: text/plain\n\n";
print $ENV{QUERY_STRING}
とかやってデータを確認したら?
確認後のエンコード周りがあやしい。
>>261
5.6触ったこと無いが,
Perl5.6は仕様を足しただけみたいだから
Perl5やってからでも特に支障無いと思う。
0272
02/01/21 16:30ID:VXT1KPc/foreach (@page){
print $_;
}
じゃいけんの?
$countってどこでインクリメントするの?
0273
02/01/21 16:36ID:rALZtRCfContent-type: text/html; charset=Shift_JIS
<html>
<head>
<title>$page[0]</title>
</head>
<body>
<h1>shift(@page)</h1>
<h2>shift(@page)</h2>
EOH
foreach (@page){
print $_;
}
具体的にはこうか?
0274
02/01/21 16:38ID:pTKsFCnA0275傍観者
02/01/21 16:40ID:bIKApu3O0276ほげ
02/01/21 16:41ID:bIKApu3O0278名無しさん@お腹いっぱい。
02/01/21 16:52ID:???名前変えてもID出てるぞ。
0279名無しさん@お腹いっぱい。
02/01/21 16:53ID:???TMTOWTDIってことで、色々出てくるのはいいんじゃねーの。
0280名無しさん@お腹いっぱい。
02/01/21 16:55ID:???おしい。
ヒアドキュメントの中では @{[shift @hoge]} のように使うと吉。
0281名無しさん@お腹いっぱい。
02/01/21 17:00ID:yxhIL91Yでも、せっかく作ってきたので書いちゃう。
どうしてもforeach使うんだったらこんな感じ。
やっぱしチェックしてない。
open (FILE,"xxx.dat"); @page = (<FILE>); close (FILE);
$page[0] =~ s/\n//g;
$page[1] =~ s/\n//g;
print <<"EOH";
Content-type: text/html; charset=Shift_JIS
<html>
<head>
<title>$page[0]</title>
</head>
<body>
<h1>$page[0]</h1>
<h2>$page[1]</h2>
EOH
$i = 0;
foreach (@page){
if ($i ne "0" && $i ne "1"){
$_ =~ s/\n/<BR>\n/g; print $_;
}
++$i;
}
print "</body></html>";
0282名無しさん@お腹いっぱい。
02/01/21 17:01ID:yxhIL91Yお、おれ?
おれかよ!(笑)
@page = (<FILE>);
close (FILE);
$title = shift(@page);
$h2 = shift(@page);
print <<"EOH";
Content-type: text/html; charset=Shift_JIS
<html>
<head>
<title>$title</title>
</head>
<body>
<h1>$title</h1>
<h2>$h2</h2>
@page;
</body></html>
EOH
0284茶文字 ◆xELvisFU
02/01/21 17:11ID:???それぞれのサンプルもきちんと見て勉強させてもらうです。
WebProg板サイコー(・∀・)イイ!
0285名無しさん@お腹いっぱい。
02/01/21 17:14ID:???ということで>>275-276はギャフンと言え
■ このスレッドは過去ログ倉庫に格納されています