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

【Perl】初心者コーナー Part18

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/11/20 22:04ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0268nobodyさん02/12/07 00:19ID:ePZJKayy
@hogeに何個か入っていてforeachで最後の1つ前までprintしたいときって
どうすればいいんでしょう?
10個あったら$hoge[9]まで、とか。
0269nobodyさん02/12/07 00:23ID:???
>>267
もちつけ。
まぁいいじゃん、基本的な原理は同じようなもんだし。
0270nobodyさん02/12/07 00:49ID:???
>>268
10要素の配列で$hoge[9]までなら全部じゃん(w
foreach (0..$#hoge-1){
print $hoge[$_];
}
とか。
0271nobodyさん02/12/07 01:08ID:yEekv6g9
Perlで糞ゲームつくりました。お試し下さいませ。
http://www36.tok2.com/home/bttl/bttl-pc/
0272yani ◆saNSktNEdQ 02/12/07 01:19ID:KB9hByzA
my $least;
foreach (@list) {
$least ||= $_;
$_ < $least and $least = $_;
}

ベタな気がする。エレガントな解法求む。
0273yani ◆saNSktNEdQ 02/12/07 01:30ID:KB9hByzA
いや、これじゃだめだな。

my $least;
foreach (@list) {
defined($least) or ($least = $_, next);
$_ < $least and $least = $_;
}
0274yani ◆saNSktNEdQ 02/12/07 02:26ID:6Rt0AxGb
こちらのほうがましか。
しかしイマイチ美しさを感じないのは気のせいか。

my($least) = @list;
foreach (@list) {
 $_ < $least and $least = $_;
}
0275nobodyさん02/12/07 03:44ID:???
Perlは整数32bitだから・・整数の最小値は・・どうなの?
027626802/12/07 04:11ID:ePZJKayy
>>270
あ、確かに全部っすね・・・(w スマソ
こういう方法があるんですねぇ。おかげさまでうまくいきました。
ありがとうございます。
0277nobodyさん02/12/07 06:27ID:???
grepでデキルような気がしますが。
forを使ってないだけで中で回ってるのは一緒だけどな。
0278nobodyさん02/12/07 06:39ID:???
$min=$list[0];
grep { $min > $_ && ( $min = $_ ) } @list;

こんな具合かな。テストしてないけど。
0279nobodyさん02/12/07 06:44ID:???
minとmaxが逆じゃん。
駄目だ寝よう。
0280yani ◆saNSktNEdQ 02/12/07 09:40ID:6bq1sAwR
>>277
そうそうgrepがあった。

手元の5.8.0の標準モヂュールで面白いものを見つけた。

use 5.8.0; ###
use List::Util qw(min);
...
$least = min(@list);
0281yani ◆saNSktNEdQ 02/12/07 11:42ID:6bq1sAwR
まあ、考えていたものがそのまんまあったわけで、それだけなら大して面白くも
ないんだが、「面白い」(ことができるかもしれない)と言ったのは List::Util::reduce のことだ。
0282nobodyさん02/12/07 11:46ID:???
やに言ってんだYO!
0283nobodyさん02/12/07 16:22ID:???
ひとりごとが多いスレですね。
0284nobodyさん02/12/07 16:24ID:/TptzaIR
結構前々から思っていた疑問なんだけど、
エラー表示させる場合「&error("文字列");」を使う例を良く見るのだが、
この場合「sub error{}」は用意しなくて良いのだろうか?
所持する本には書かれていなくて……。

ちなみに漏れは「die」関数を使ってます。
0285nobodyさん02/12/07 16:58ID:???
ふーん。。。
0286nobodyさん02/12/07 18:32ID:???
帰ってこないからgoto error使ってるけど、、、別にいいよね?
0287nobodyさん02/12/07 20:46ID:???
>>284
自分でつくるんでねぇ?

>>286
構造化プログラミングとかの本を見ると、GOTO分はプログラムの流れがワープしちまって
全体を把握するのが困難になるからいくないらしい
昭和57年頃の本だけど(藁
0288nobodyさん02/12/07 21:03ID:???
goto の先でプログラムがお亡くなりになるということが
わかっていたら混乱することもないんじゃない?
0289nobodyさん02/12/07 21:06ID:???
>>284
自分で好きなの作ろうぜ。>sub error { }
きちんとエラーメッセージ吐いてその時の環境変数やら標準入力の内容やらも表示すれば、
デバッグに便利。
0290nobodyさん02/12/07 21:54ID:HolpJHok
外部のWWWサーバからファイルを取得するのに一番負荷が少なくて、早いのは何ですか?

SOCKET
WGET
LWP

WGETはサーバに入っていないので。。
LWPよりSOCKETの方が早いと思うんですが。
0291nobodyさん02/12/07 22:00ID:???
>>288
自分だけが読むとは限らない罠
そして1年後の自分は別人である
0292nobodyさん02/12/07 22:31ID:HolpJHok
これはマジで儲かりますよ!!
実際私はこれで毎月30000円稼いでいます、
しかも毎月1000万円が当たるチャンスなどあります。
お小遣い稼ぎに是非!!!

http://www.fruitmail.net/cgi/introduce_jump2.cgi?901913
0293nobodyさん02/12/07 22:58ID:???
>>290
Socketの方がなんぼか早いだろうなあ。
でも、それぐらいだったらLwp使って安全かつシンプルに持ってくる方が俺はいいな。
SocketだったらRFCとかきちんと目を通さないと、正しいものは作れないだろ?
0294nobodyさん02/12/08 10:58ID:H7RlugSZ
perlstyleのよると、サブルーチンは全部小文字のほうがいいと書いてあるけど、どうしてですか?
0295nobodyさん02/12/08 11:38ID:???
>>294
「サブルーチン名は、全部小文字の方がいい」だろ?
モジュール名は(プラグマ以外は)大文字で始めろともあるだろう。
それと合わせたんじゃないか? 区別がすぐにつくように。
ま、作法の話だから、あんまり深く考えるな。
従ってれば、いつかきっと自分の中で決着がつく。
0296nobodyさん02/12/08 11:43ID:???
sub SuBrOuTiNe{
    print "ふーん。。。\n";
}
0297nobodyさん02/12/08 12:07ID:H7RlugSZ
>>295
なるほど、ソースの読みやすさのためなんですね。
モジュールは使ったことがないので今まで気にならなかったんだと思います。
0298nobodyさん02/12/08 13:10ID:???
シツモソです。
Perlで、累計・今日・昨日のアクセス数をカウントするカウンターCGI(IMG or JSタグでCGI起動)
を設置しようと思ってるんですが、カウントの方法で少し悩んでます。

count.cgi?total でカウント処理(累計+1, 今日+1)
count.cgi?today で今日のカウントをロードするだけ
count.cgi?yesterday で昨日のカウントをロードするだけ

上の順でCGIが呼ばれると正常にカウントされるんですが、
昨日、今日、累計の順に呼ばれると、当然昨日と今日のデータはカウントされる前のものになっちゃいます。

今日と昨日のCGI が呼ばれたら、sleep(1)をして、累計のカウントがおわるまで待つ
というのも考えたんですが、あまりいい方法じゃないなーなんておもいますた。

また、カウントだけをする count.cgi?count みたいなタグを入れて、
そのタグを一番上に置いて、累計・今日・昨日のタグがきたらカウントデータを読むだけ
ってしても、やっぱり設置場所によってはデータがずれたりしてきちゃいます。

おい、おまえら!もしいい方法がありましたら教えて下さい。
0299nobodyさん02/12/08 13:37ID:???
count.cgi?totalで累計のカウントを+1して累計のカウントを出力
count.cgi?todayで今日のカウントを+1して今日のカウントを出力
count.cgi?yesterdayで昨日のカウントを出力

で良いべさ。
030029802/12/08 13:40ID:???
>>299
( ´,_ゝ`)プププッ!!
0301nobodyさん02/12/08 16:23ID:GWJer8wb
jcode.plは$hoge{'hoge'}を変換できないんでしょうか?
&jcode::convert(\$hoge{'hoge'},'euc');
てやってもだめなので一回普通に変数に代入して変換して元に戻して
いるんですが・・・。
0302nobodyさん02/12/08 17:22ID:???
>>301
それは何かが違うから。
0303nobodyさん02/12/08 23:59ID:???
今、掲示板を作成中なんですが、ファイルロックの掛け方がいまいち分からない・・・・
flockの使い方教えてくらはい。とりあえずはflockがサーバで使えるみたいなので。
そんなやつが掲示板など作るな!とかいわれそうですがお願いいたします。
参考になるサイトだけでも結構なんでお願い。
半日ググってたら、何が何やら分からなくなってしまいました。
0304nobodyさん02/12/09 00:07ID:???
>303
ttp://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=UTF-8&as_qdr=all&q=perl+flock+%E4%BE%8B&lr=lang_ja
検索サイトの使い方のコツを覚えた方がいいんじゃないか?
0305nobodyさん02/12/09 00:21ID:???
素早い回答ありがとうございます。
今まで「perl cgi flock 掲示板」やら「flock 掲示板」やら、
しらみつぶしにサイトを見まくっていたら頭が変になっていました。
「例」で検索するのをすっかり忘れていました。
本当に感謝です。>304
0306nobodyさん02/12/09 20:40ID:30vqgT1r

%ex = (
hoge => "hage",
xxxx => "$ex{hoge}",
);



みたいにしたいのですが、
Global symbol "%ex" requires explicit package name at ファイル名 line 13.
みたいにエラーが出ます。
どうすればいいですか?
よろしくお願いします。
0307nobodyさん02/12/09 21:00ID:???
#use strict;
0308nobodyさん02/12/09 21:01ID:???
my %ex
0309nobodyさん02/12/09 21:13ID:???
our %ex ;
0310nobodyさん02/12/09 21:14ID:???
your %ex;
0311nobodyさん02/12/09 21:34ID:30vqgT1r
>>307
use strict;をコメントアウトしたら、エラーは出なくなりましたが、
$ex{xxx} に $ex{hoge} の値が代入されていませんでした。

実際には、my %ex; です。写し間違えでした。
0312nobodyさん02/12/09 21:38ID:???
てかそんなことできんの?
0313nobodyさん02/12/09 21:59ID:???
>>311
(
hoge => "hage",
xxxx => "$ex{hoge}",
)
が評価される時点で$ex{hoge}に何も入っていないなら当然。
031430202/12/09 22:25ID:???
>>311
折角のstrictなソースをクズに変えるから糞
0315nobodyさん02/12/09 23:42ID:???
use strict って何?
0316nobodyさん02/12/09 23:46ID:???
おまじない
0317nobodyさん02/12/10 00:21ID:???
HTML::FillInForm って、
checkboxや、radioのcheckedは、引き継げないんですか?
031831702/12/10 00:29ID:???
出来ました。すいませんでしたー。
0319nobodyさん02/12/10 11:20ID:???
変数って変数で作ることできるんでしょうか。
たとえば、

$count;
$hoge;
foreach $count (1 .. 10){
 $hoge$count = "文字:$";
}
こんな感じでつまり、
$hoge1 = "文字:1";
$hoge2 = "文字:2";
〜
$hoge10 = "文字:10";
こういう事はできるのかなという事です。
これだとやはり$hoge$countの書き方がまずいようでエラーになります。
0320nobodyさん02/12/10 11:27ID:???
なぜ配列を使わないのかと小一時間問いつめたい。
0321nobodyさん02/12/10 11:59ID:???
>319
推奨:$hoge[$count]  # ただし$countが数字の場合のみ
推奨:$hoge{"$count"}  # $countが文字列の場合
非推奨:${"hoge$count"}
0322nobodyさん02/12/10 12:53ID:???
>>320
ごめんなさい、小一時間じゃ済みそうにないんでまた次回。
>>321
その技の名前はなんですか。
0323nobodyさん02/12/10 13:14ID:???
 配 列 と 連 想 配 列 ( ハ ッ シ ュ ) で す が な に か ?
0324nobodyさん02/12/10 13:22ID:???
× 推奨:$hoge[$count] # ただし$countが数字の場合のみ
○ 推奨:$hoge[$count] # ただし$countが自然数の場合のみ

負の数とか小数を使われたらたまらんから訂正。
0325nobodyさん02/12/10 13:26ID:???
自然数の定義を教えて下さい。
0326nobodyさん02/12/10 13:31ID:???
辞書引け。
0327nobodyさん02/12/10 14:02ID:+QGYbS02
1バイトと2バイトが混在している文字列から頭の3文字を
抽出するにはどうすればいいのでしょうか?
例えば『あいうえお』,『Aいうえお』などの場合です。
substrを使うと『Aいうえお』がおかしくなってしまいます
0328nobodyさん02/12/10 14:10ID:???
>327
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Split
0329nobodyさん02/12/10 14:16ID:???
>328
Thanks
0330nobodyさん02/12/10 15:27ID:???
>>321
すいません、よく考えたらただの配列じゃダメなんです。
$hogeと$iを合体して、
「$hoge1」という変数自体を作りたいんです。
よって、「$hoge1」という変数に文字とかを代入したりしたんです。
0331nobodyさん02/12/10 15:46ID:???
質問お願いいたします。
書き込み処理の所なんですが、

open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
truncate(OUT,0);
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
close(OUT);

    と

open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
truncate(OUT, tell(OUT));
close(OUT);

ではどちらがいいんでしょうか?
ただtruncateの使い方がちょっと違うだけなんですが・・・。
それ以前に文法的に間違っていたらご指摘お願いします。
0332nobodyさん02/12/10 15:52ID:???
>>330
リファレンス使えばよろし。

>>331
下。
既出のような気がするのは思い過ごしでしょうか。
0333nobodyさん02/12/10 16:10ID:???
>>331
早速の回答Thanksです。
既出でしたか・・・お手数おかけしました。
過去ログまた読み直して出直してきます。
0334nobodyさん02/12/10 16:11ID:???
>331じゃなかった
>332さんごめんなさい。
0335nobodyさん02/12/10 16:17ID:???
>>330
せめて、配列じゃなくって$hoge1という変数が欲しい
理由を書いてもらえませんか? もしかするとその原因
自体変更することで、全体としてすっきりするっていう
可能性もありますから。
0336nobodyさん02/12/10 19:01ID:4NsDPNiK
パスワード生成と、照合を別スクリプトにするのはやっぱりだめですか?

作ろうとしてるのは、パスワードを作るだけのスクリプトと、そのパス
を使って管理する掲示板なんだけど・・・文法チェッカかけたら
「Missing right curly or square bracket at hoge.cgi line 65, at end of line
syntax error at hoge.cgi line 65, at EOF
hoge.cgi had compilation errors.
」
ってなってしまった。。。
033733602/12/10 19:02ID:4NsDPNiK
あ、上のエラーでるのはパス生成のスクリプト。
0338nobodyさん02/12/10 19:04ID:???
ご教授お願い致します。
メールの受信をしたいので、下記のように記述したのですが

0 use Net::POP3;
1 unless ($pop = Net::POP3->new("$HOST")) {
2  print "POP3接続失敗 \n";
4 }
5 $pop->user($LOGIN_NAME);
6 $auth_check = $pop->login($LOGIN_PASS);
7 if( $auth_check == undef )
8 {
9  print "認証: NG \n";
10 }

どうしても、認証NGとなってしまいます。
POPサーバーには、Win2000 exchangeを使用しているため
ログインユーザー名に、「ドメイン\\ユーザー名」と記述したり、
しなかったり、と色々試してみたのですがダメでした。
ちなみに、モジュールが置いてあるマシンからPOPサーバーへの
pingは通りました。

どなたか、分かる範囲で構いませんので
ご指摘下さい。
0339nobodyさん02/12/10 19:06ID:???
>>336
ただの文法エラーですね。
カッコの付け忘れ。65行目参照。
034033602/12/10 19:06ID:4NsDPNiK
パスワード生成スクリプト=フォームに入力した文字をCryptで
暗号化して、それをファイルに保存(ファイルを作成というコマンド
がない?ので、ロックファイル作成のコードを使ってます)、というもの。
エラーが出ている65行目は。。。
sub error {
&head;
print <<"ERR"; #ここが65行目。
<center>
<hr>
<font color="#C20000"><b>エラー</b></font><hr>
$_[0]
<hr>
</body>
</html>
ERR

}
何が違うんでしょう??
034133602/12/10 19:07ID:4NsDPNiK
339>>
カッコ?!
・・・見てみます。
0342nobodyさん02/12/10 19:15ID:???
>>336
エラーの内容から恐らくヒアドキュメントの書式を間違えてます。
0343nobodyさん02/12/10 19:17ID:???
<p>$_[0]</p>
0344名無しさん02/12/10 20:10ID:???
>>336
#ここが65行目。の#が全角になってるのは問題ないのか?
034533802/12/10 21:05ID:???
モジュール本文の記述が誤字だらけでしたので
とりあえずもう一度、修正版を書いておきます。

0 use Net::POP3;
1 unless ($pop = Net::POP3->new("$HOST")) {
2  print "POP3接続失敗 \n";
4 }
5 $pop->user($LOGIN_NAME);
6 $auth_check = $pop->pass($LOGIN_PASS);
7 if( $auth_check == undef )
8 {
9  print "認証: NG \n";
10 }


0346nobodyさん02/12/10 21:24ID:???
APOP
0347nobodyさん02/12/10 21:51ID:???
すいません、配列の要素の中に他の配列の全てを叩き込むって出来ないんでしょうか?

@test=("か","き","く","け","こ");
@hoge=("あいうえお","テスト","さしすせそ","たちつてと","");
@hoge{1}=@test;
$data=@hoge[0];

このようにすると$dataの中には「か」だけが格納されてしまうのですが。
0348nobodyさん02/12/10 21:52ID:???
>>345
まずtelnetで叩いてみろや。
034934702/12/10 21:53ID:???
誤 $data=@hoge[0];
正 $data=@hoge[1];
0350nobodyさん02/12/10 21:56ID:???
$hoge[1] = join('', @test);
0351nobodyさん02/12/10 21:59ID:???
>>350
ありがとうございます、助かりました。
0352nobodyさん02/12/10 23:43ID:???
つーか、むしろ、こういうことじゃないのか?

@test=("か","き","く","け","こ");
@hoge=("あいうえお","テスト","さしすせそ","たちつてと","");

$hoge[1] = \@test;

print $hoge[1]->[5];
print $hoge[1][3];

print @{$hoge[1]}
0353nobodyさん02/12/11 00:22ID:???
ちょっくら質問!
open(FILE,"xxxx");
@file = <FILE>;
@file = @file[0..8];
seek(FILE,0,0);
print FILE "zzzz";
print = @file;
close(FILE);
このように添字を使って”xxxx”の記録数を10にしたんだけど、
これはかなりダサイやり方?

0354nobodyさん02/12/11 01:45ID:fCm39Cv9
>>353
モードは"+>"だよね。そのコードからすると。

@file = ();
push @file, scalar <IN> for 0..8;
のほうがいいと思うよ。
0355nobodyさん02/12/11 11:59ID:IDueDvlE
そういやWin2000マシンのアクチブパールを5.6.1から5.8に入れ替えたらGDBM_File使えなくなった。
こちらのスレに対策知ってる神はいらっしゃる?
0356nobodyさん02/12/11 12:50ID:???
Firebirdなんですけど
$sql = "insert into *** values( '***' )";
$statement = $dbHandle->prepare( $sql );
$sqlResult = $statement->execute;
この$sqlResultには何が返ってくるのでしょうか。
見たんですけど何も入っていませんでした。
0357nobodyさん02/12/11 13:21ID:mexeU5Q0
use Time::Local;
しても
timelocalが使えません。

助けてください。
0358nobodyさん02/12/11 13:25ID:???
>>357
実はPerl4ってことはないか?(w
ところでどう使えないんだ?エラーが出るのか?値が不正なのか?
良ければここにソースを書いてみれ。
0359nobodyさん02/12/11 13:25ID:mexeU5Q0
>>357
のことは忘れてください。。。
0360nobodyさん02/12/11 14:40ID:???
>>356
Firebirdかなんか知らんが、つまりはDBIだしょ?

$sqlResult = $statement->execute();
で、処理した件数が返ってくるはずだが・・・
0361nobodyさん02/12/11 15:55ID:3BdsDO3l
サイト制作スレから誘導されてきました。

コマンド「chmod」の代わりになるコマンドってあるんですか?
もしあるのであれば教えてください。
もしくは
$ImgFile = "$ImgDir$no$tail";
if (!open(OUT,"> $ImgFile")) {
if ($clip_err) { &error("画像のアップロードに失敗しました"); }

}
binmode(OUT);
binmode(STDOUT);
print OUT $upfile;
close(OUT);

chmod (0666,$ImgFile);

この部分をchmodを使わずに構成する事はできませんか?
>>1で指定された書き方が出来そうにないのでこういう形でお聞きします。
どなたかお願いします。
0362nobodyさん02/12/11 16:10ID:???
お勧めできないかもだけど
open(OUT, "> $ImgFile")より上に umask 0;
0363nobodyさん02/12/11 16:22ID:IDueDvlE
>>358
いえ、Perl4なんてことはないっす。w
前はActivePerl5.6.1ビルド633でGDBM_FileをPPMインスコした記憶があって、
今回ActivePerl5.8.0ビルド804にする際以前の5.6.1ビルド633は綺麗さっぱり
DISKから消してしまったんです。GDBM_Fileは後からインスコすればいいという
考えで。
そしていざGDBM_Fileのインスコしようと思ったら、Perl5.6用しか見つからなくってお口あんぐり状態な訳です。

エラーは
Can't locate GDBM_File.pm in @INC (@INC contains: C:/perl/lib C:/perl/site/lib .) at (eval 1) line 2. BEGIN failed--compilation aborted at (eval 1) line 2.

と、漏れのマシンにGDBM_Fileが装備されてないって出ます。
ソースの抜粋は。。。自分が作ったスクリプトじゃない配布物なんで、カキコするのもちと・・・。
動作は電話帳データベースのようなもので、電話番号を入力すれば住所が分るといったものと同等です。

暫く待てばPerl5.8(Windows)用のGDBM_Fileが出てくるのかな?
0364nobodyさん02/12/11 16:44ID:???
>>362
chmodの行を削って
open(OUT, "> $ImgFile")より上に umask 0;
という事でよろしいですか?

ありがとうございました。
0365nobodyさん02/12/11 17:50ID:???
スクリプトの中で、
require './jcode.pl'; # jcode.plのパス
をしてjcode.plを呼んでるんですけど、コマンドラインで
「C:\>perl "C:\Documents and Settings\***\デスクトップ\unko.cgi"」
を実行すると、
「Can't locate ./jcode.pl at C:\Documents and Settings\***\デスクトップ\unko.cgi line 17.」
と出てしまいます。
(webだとエラーになりません。ローカルではデスクトップでスクリプトを実行しています。)
なぜでしょうか。
0366nobodyさん02/12/11 18:14ID:???
require 'jcode.pl';
require '.\jcode.pl';
0367nobodyさん02/12/11 19:35ID:???
>>365
カレントディレクトリに jcode.pl がないんでしょ。
そのコマンドラインだと、カレントは C:\ で、スクリプトのある場所と違ってるし。
■ このスレッドは過去ログ倉庫に格納されています