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

Perl 初心者コーナー Part24

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

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


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

過去ログやお勧めサイトは >>2-10
0781nobodyさん03/06/23 12:40ID:???
>>780
動かないって言えば分かるだろ、出力がない。
プログラムが終わらない。うんともすんとも言わない。
0782nobodyさん03/06/23 12:41ID:???
>>780
ところでちみは、相当の厨だな。フリーズだって(藁
0783nobodyさん03/06/23 13:01ID:???
>781
>780ではないが、この初心者スレでは、それ以外の場合でも「動かない」と表現する奴がいる。
というか多い。
それくらいわかるだろ。

バッファリングを止めても変わらないか?
0784nobodyさん03/06/23 13:24ID:???
俺も一発でバッファリングのせいだと分かったけど・・・
0785nobodyさん03/06/23 13:28ID:???
「動かない」って言ってるんだから、100秒待っても動かないんじゃねーの?(ワラ
0786nobodyさん03/06/23 13:46ID:???
>>783, >>784
ありがとう。
$| = 1;
を入れたら無事出力できました。
0787nobodyさん03/06/23 16:14ID:???
Perlで掲示板を作っています

スクリプトの最初の方で

if ($mode eq 'regist') { ®ist; }
elsif ($mode eq 'find') { &find; }
         :

とズラズラ書き並べるのはカッコ悪いのですが
何か恰好良い方法はありませんか?
0788nobodyさん03/06/23 16:19ID:???
>>787
カッコワルイって・・・。
サブルーチンを上に書けば?
078978703/06/23 16:29ID:???
すいません言葉が足りませんでした。
use CGI;
$q = new CGI;
$mode = $q -> param('mode');

とかしますよね。でもサブルーチン使ったとしても
どこかに
> if ($mode eq 'regist') { ®ist; }
> elsif ($mode eq 'find') { &find; }
>          :
みたいのはどこかに絶対あるわけで
これがなんとかならないかな とか

SWITCH:
{
if ($mode eq = "regist" ) (®ist;last SWITCH)
if ($mode eq = "find" ) (&find;last SWITCH)
         :
}
こうやれば多少はましかな‥
でもズラズラ書くのは変わらないので恰好良くないな とか。
0790nobodyさん03/06/23 16:36ID:???
ずらずら書いたらダメなのかよっ!
0791nobodyさん03/06/23 16:38ID:???
>>789
eq = てなんどい。
Perlにかっこよさを求めるのはおろかな気が。


サブルーチンごとに分けずに、
if($mode eq 'assa'){
   処理
   処理
}
ってしたら?醜いけど。
0792nobodyさん03/06/23 16:40ID:???
>>789
他に方法はあるか?
ハッシュで関数テーブルみたいなものをつくるか?
それでも初期化時にずらずらと書くことになるけど。
0793nobodyさん03/06/23 16:41ID:???
>787
こうすると一つで済むよ。
eval(&$mode);

このスクリプト(?)の指摘禁止ね :-)
079478703/06/23 16:42ID:???
そうですね。
>Perlにかっこよさを求めるのはおろかな気が。
これが全てですね。 適当に実装しますです。
0795nobodyさん03/06/23 17:20ID:vdloYxxu
DBMってtieでハッシュに関連付けた時点で、すべて読み込まれて、メモリにはいるんですか?
0796nobodyさん03/06/23 18:25ID:???
>>795
はいる。
メモリーキャッシュにまるごと入るからこそ早いとも言える。
0797nobodyさん03/06/23 18:44ID:???
>>796 サンクス
200kb位あるのを、丸まま読み込んだらまずいですかね。
CGI利用です。
0798nobodyさん03/06/23 18:51ID:???
>>797
やってみろよ
メモリがどれだけ割り当てられているか、残りはどれぐらいかなんて
環境次第なんだから
0799nobodyさん03/06/23 19:03ID:???
>>798
ローカルでは問題ないんですが、共有鯖だとどうかな、と。
まぁ、あげてみて試してみます。
同じことをテキスト保存でやったら、ファイルサイズは20`くらいなんですが、遅い。
どうしようか・・・。
0800nobodyさん03/06/23 19:11ID:???
>>795 かわいそうに、、、、まんまと騙されてるね。
通常、索引編成ファイルのキーや値は、任意でないかぎりメモリに入る事はないよ。
Perlだと、確かにDBMファイルとの接続速度は遅いけど、データは読込んでないから、大丈夫。
796とか798の言ってることは相手にすんな。
0801nobodyさん03/06/23 21:03ID:???
>>800
へ〜
物 知 り で す ね
0802nobodyさん03/06/23 22:02ID:???
>>801
間違いを指摘されたからってそうムキになるなよ。
0803nobodyさん03/06/23 23:34ID:???
>>787
Perlでswtich文使えたらいいなー、って思うことしきり。
0804nobodyさん 03/06/23 23:46ID:???
>>787
リファレンスと配列を使うとか、無名のサブルーチンで、ハッシュを使うとか書き方あると思うけどねィ・・・

んで、カッコいいよりも見やすい記述を心がけるべきだと思ったり・・・
0805nobodyさん03/06/23 23:59ID:???
>>803
だね。switchあるだろ、とか思ってリファレンス見直して 無いことに気付いたw
080680303/06/24 00:16ID:???
>>805
同じことしてるなw
0807nobodyさん03/06/24 00:20ID:???
まあ、switch無くても、
if
elsif
elsif
elsif
で処理速度は落ちないんだけど、見た目が、、、
0808nobodyさん03/06/24 00:26ID:???
>>807
見た目を気にするならSwitchもどき使えばいいんであ?
ttp://tech-web.net/perlmania/perlsyn3.html
0809nobodyさん03/06/24 00:41ID:???
>>808
ちょっと冗長すぎて、それならまだif elseのほうが・・・
swtich使いたいのは、見た目がスッキリするからなので
0810nobodyさん03/06/24 00:41ID:???
うーん、その他の方法も見た目が良いとは言えないな
0811nobodyさん03/06/24 03:06ID:???
ある変数$Aの先頭2バイトを$Bへ代入し、$Aには先頭2バイトの次からが残る。

単純な質問かもしれませんが、どうか教えてください。キーワードが考え付かず、
ググっても見つけられませんでした。(←力不足っす。。)
0812nobodyさん03/06/24 03:31ID:???
>>811
TMTOWTDI.

# substr
($A, $B) = (substr($A, 2), substr($A, 0, 2));

# unpack
($B, $A) = unpack 'A2A*', $A;

# 置換1
$A =~ s/^(..)//;
$B = $1;

# 置換2
$A =~ s/^(..)/($B = $1, '')[1]/e;

# 回りくどい方法
@tmp = split //, $A;
$B = join '', splice @tmp, 0, 2;
$A = join '', @tmp;
0813nobodyさん03/06/24 03:31ID:???

s/^(.{2})//;
$1;

こんなんじゃダメかね、ダメだね。文字だもんね。
あんたのやろうとしてることは、関数で出来るよきっと。
普段そうゆう処理しないから名前は知らんけど。
どっかのサイトの関数一覧をどうぞ。
上の正規表現で十分ならそちらをどうぞ。
08145203/06/24 03:37ID:???
ありがと〜〜〜〜〜〜
# unpack
($B, $A) = unpack 'A2A*', $A;
コレ使わせてもらいました。
0815nobodyさん03/06/24 04:16ID:???
記憶があいまいだけど、5.?に無かったっけ?<Switch
0816nobodyさん03/06/24 05:14ID:???
>>812>>813
変態的にすごいな。
そういうのは一瞬で浮かぶんでしょうか?
0817nobodyさん03/06/24 06:44ID:???
浮かぶもんだよ。
アルゴリズムを見れば、どの関数を使うべきか直感的に分かるから。
たくさんコードを書いてると自然に身についてくる。
0818nobodyさん03/06/24 07:03ID:???
みんな変数名やサブルーチンの名前付けるときってどうしてる?
分かりやすい名前付けた方が後々分かりやすいって聞くけど、
その名前が思い付かないとき…。

漏れコーディングより、名前で時間くう…。
こんな漏れって変でつか…?
0819nobodyさん03/06/24 07:31ID:???
>>815
少なくとも 5.8.0 には標準で Switch.pm がある。

use Switch;
switch ($val) {
  case 1     { print "number 1" }
  case "a"    { print "string a" }
  case [1..10,42] { print "number in list" }
  case (@array) { print "number in list" }
  case /\w+/  { print "pattern" }
  case qr/\w+/ { print "pattern" }
  case (%hash) { print "entry in hash" }
  case (\%hash) { print "entry in hash" }
  case (\&sub) { print "arg to subroutine" }
  else       { print "previous case not true" }
}
0820nobodyさん03/06/24 08:07ID:???
>>818
$hensuに。
0821nobodyさん03/06/24 08:34ID:???
>>818
変数名の prefix に規則性持たせてつけてるよ
082281803/06/24 08:49ID:???
>>820
どういうこと?
とりあえず$hensuにしとくってこと?

>>821
漏れもVBやってたときは付けてた。
0823nobodyさん03/06/24 09:26ID:2JWEavap
CarpのfatalsToBrowserでエラー捕まえられない時があるんだけど、
「500 Internal Server Error」が出てしまう時がある。
httpdのログを見る限りエラーメッセージが出てるんだけど・・・
回避方法って無いですかね?
0824nobodyさん03/06/24 10:41ID:???
>>818
クラス名・変数名に迷ったら書き込むスレ
http://pc2.2ch.net/test/read.cgi/tech/1046541730/

こんなスレもあるでよ
082581803/06/24 10:44ID:4jjnB7QK
>>824
初耳です。
こっち行きます。
0826nobodyさん03/06/24 10:44ID:???
>>823
いったい何を言ってるんだ?
まともな文章と書くスレを選ぶ方法を先に学べ
0827nobodyさん03/06/24 11:05ID:???
でもperlはカウンタとか一時変数とかは名前付けなくていいし、
ネーミングで困ることは少ないな
大抵そういう、どうでもいい変数で困る事が多いし
0828nobodyさん03/06/24 11:11ID:2JWEavap
>>826
分からないなら、しゃべんなって。
な。
0829nobodyさん03/06/24 11:19ID:???
>828
お前はあの文章がわかんのか、とか思ったら本人だったので鬱
0830nobodyさん03/06/24 11:23ID:???
CarpとCGI::Carpは違う。
0831nobodyさん03/06/24 11:27ID:???
>>828
お前の文章も確かにおかしいぞ
0832nobodyさん03/06/24 12:32ID:???
頭おかしい奴が(・∀・)キテルー
0833nobodyさん03/06/24 13:40ID:???
ログ見てエラーが出てるんなら、そのエラーメッセージ見て解決策を考えろ。
0834nobodyさん03/06/24 13:59ID:???
2JWEavapは恥ずかしくてもう来られない
0835nobodyさん03/06/24 14:10ID:RsywTEy7
DBI使ってDBを操作するとき、SELECT文の結果は配列で返ってきます。
つまり値を参照するときはフィールド番号(って言うんですか?)で指定しなければいけません。
$record[2]みたく。
できれば、フィールド名で参照したいんですけど、それって無理なんですか?
連想配列みたいになれば言うことないんですが。
$record{'DATE'}って感じに参照したいんですけど、DBIだけでは無理?

どの解説サイトみても、「配列でかえります」までしか説明されてませんでした。
0836nobodyさん03/06/24 14:29ID:???
BBS作ってるんですけど、例えばレスが800あるスレッドを
表示する時2ちゃんねるみたいに
1&750-800みたいに途中を飛ばして表示するとして
ログがレス順1から順に並んで保存されてるとすると
2-749まで空読みして飛ばしますよね?
これって無駄に思えますが何か良い方法ありませんか?
レスを逆順に800,799・・・保存する方法も考えましたけど
これだと表示時に表示するレスの分だけメモリ消費して
こちらも無駄かなと思ってしまうんですが。
全レス表示したら全レス分配列必要だし。

前者だとレスが多いスレだとCPU負荷がかかるし
後者だとメモリを多く消費してしまうし、何か他の選択が
ないでしょうか?
0837nobodyさん03/06/24 14:31ID:???
>>836
1レスの長さを固定してseekとreadを駆使して読み出すのが効率いいんじゃない?
0838nobodyさん03/06/24 14:38ID:???
>836
1レス1ファイル形式(w
0839nobodyさん03/06/24 14:48ID:???
>>835
http://member.nifty.ne.jp/hippo2000/perltips/dbimemo.htm
よく読んで毛
0840nobodyさん03/06/24 15:07ID:py7llED6
☆とにかく可愛い娘のH画像です☆
http://endou.kir.jp/yuminet/link.html
0841nobodyさん03/06/24 15:10ID:???
>>836
1000回の空読み <<<<< ファイルのopen
というか、
1000回の空読み <∞< perlのオーバーヘッド

何をするにもCPU負荷はかかるけど、
定量的に考えないと。

あと、これはバリ私見&経験則だけど、
最近のマシンは一般的なwebサーバー用途で考えると、
バランス的にCPUだけの性能が突出してます。
仮に、1Gメモリー積んでCPUがPIII 1Gぐらいのとき、
先ず、CPUが足りなくなる前にメモリーが足りなくなります。
(これは、webサーバーやRDBMSがメモリー食いすぎというのも理由だが)
なので、CPUとメモリーはトレードオフの関係にあるときは、
メモリー優先で基本的にはOK。
0842nobodyさん03/06/24 19:20ID:???
>>838
一度それで作ったことあるけど微妙w

やっぱ1ファイルで空読みかねぇ。
0843nobodyさん 03/06/24 19:55ID:???
そんなけ書き込み激しいのならば、DB使うだろ・・・
0844nobodyさん03/06/24 22:48ID:???
>>836
無駄っちゃ無駄だけど、小細工してもたいして効果ないよ
0845nobodyさん03/06/25 00:40ID:???
ハッシュのキーって、全角文字でもいけますか?
0846nobodyさん03/06/25 00:59ID:???
>>845
いけるらしいです。
俺は、試してないけど。

でも、あまり推奨されるような物じゃないと思うので、
極力避けましょう。
0847nobodyさん03/06/25 01:18ID:Ai+C7V0g
質問がございます。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<TITLE></TITLE>
</HEAD>
<BODY>
<FORM action="test.cgi" method="POST">
%%errmsg%%
E-mailアドレスを入力して下さい。<BR>
<INPUT size="30" ="text" name="email" value="%%email%%"><BR>
確認のため、再度入力してください。<BR>
<INPUT size="30" type="text" name="confirm" value="%%confirm%%"><BR>
<BR>
<INPUT type="submit" value="送信"></FORM>
</BODY>
</HTML>

これを変数化したものを
$html =~ s/\%\%.+?\%\%//gs;
このように「%%〜%%」を全て取り除くはずなのですが、
なぜか$html =~ s/\%\%.+?\%\%//gsi;
でないといきませんでした。%%%%に大文字も小文字も無いとは思いますが、、、
どうしても腑に落ちないため、質問させていただきました。
宜しければどうかご教授ください。宜しくお願いいたします。
0848nobodyさん03/06/25 01:20ID:???
>>>845
問題なし
084984503/06/25 01:30ID:???
>>846 >>848
thx.
プログラム関係の板の人は怖い人ばかりだと思っていたけど、
ちゃんとレスくれて嬉しいです。ではまた
0850nobodyさん03/06/25 06:35ID:???
>>847
$html =~ s/%%.+?%%//g;
で、動かないかい?
それはさておき、%%strings%%で書き換えるHTMLテンプレートをよく見かけるけれども、
鬱陶しくなぁい?
%sにしてsprintfで一気に書き換える方が楽そうに思えるけれども。

それはさておき、正しいHTMLを描きましょう。
0851nobodyさん03/06/25 11:07ID:???
<p>で開いたパラグラフは
必ず</p>で閉じましょう
0852nobodyさん03/06/25 14:07ID:???
>>850
それじゃ、コード側で順番が固定されてしまうだろ
0853nobodyさん03/06/25 16:44ID:???
>>851
</p>は省略可能だけど、それを意識して省略しましょうね。ということでよろ。
>>852
そだよ。そんなに頻繁にテンプレを変えるのは少々難ありだと思うけれども。
0854nobodyさん03/06/25 17:48ID:???
>>853
テンプレは変わるだろ。システム変わらずともデザインが変わることは多々ある。
あとDOCTYPEの指定がないのに省略可能と言い切るのはすごいな。
0855nobodyさん03/06/25 18:36ID:???
ハ゜ールのcgiをいじっていたら、漢字の「表示」が正しく表示されない
のですが、これは文字コート゛の問題なのですか?
普通はどう解決しますか?
0856nobodyさん03/06/25 18:38ID:???
>>855
漢字を使わない。
0857nobodyさん03/06/25 18:45ID:???
>>855
それくらい、とほほにも書いてある。聞く前に調べる。
0858nobodyさん03/06/25 19:49ID:???
表\示

これで表示される。Shift-JIS だと「表」のコードが \x95\x5c となる。
\x5c(\) が perl だと特別に解釈される文字なのでおかしくなる
085985503/06/25 20:04ID:???
すいません自己解決しました。
0860nobodyさん03/06/25 20:18ID:???
普通はどう解決しますか?

明らかに突飛な解決策が提示される

「調べろ」とアドバイス

同情した奴がマジレス

自己解決


まったく噛み合ってないな(w
0861ayaya03/06/25 20:35ID:???
始めまして!私と顔を見ながらチャットしませんか?楽しい会話をしましょう
アドレスです!http://www.loveshelter.tv/まで!沢山きてね(^o^)丿
待ってまーす
0862nobodyさん03/06/25 20:49ID:+p8CFadc
test->func();
test::func();
この呼び方で、どちらでも動くようにfunc()をコーティングしたいんだけど、
いい方法知らないすか?
0863nobodyさん03/06/25 21:02ID:UMoE3ZS2
unicodeの文字列をURLエンコードするにはどうすればいいのでしょうか?
JavaScriptのescapeのように、あいうえお<->%u3042%u3044%u3046%u3048%u304A
といった感じで変換したいのです。
$value =~ s/(\W)/'%' . unpack 'H2' , $1/eg;
とやっただけではムリでした。

どのようすればいいのでしょうか?
0864nobodyさん03/06/25 21:12ID:???
ファイルテスト演算子の-Mについてですが、
取得する時間って24*60*60しないとちゃんと取得できないの?
0865nobodyさん03/06/25 21:13ID:???
>>861
これで見たの3回目だ。NGワードに入れた
0866nobodyさん03/06/25 21:40ID:???
>>862
1.与えられた引数とは全く関係なしに、決まった結果を返す。
2.与えられた第一引数を調べ、それがオブジェクトかそうでないかを判断する。
ref $_[0] でなんとかなるだろ。
0867nobodyさん03/06/25 21:42ID:???
>>864
本読め。
-M で取得できるのは、最終更新日からの日数だと明記してある。
秒に変換したいなら、*24*60*60しないとどうしようもないわな。諦めろ。
0868nobodyさん03/06/25 23:29ID:???
>>867
>>864のメル欄
0869nobodyさん03/06/25 23:52ID:???
完全に成功した釣りの例ではあるが、
今一つ爽快感に欠けるのは、-Mについて聞くのが
どのくらい愚かなのか実感が無いからだな
0870nobodyさん03/06/26 00:03ID:???
>>868
釣られた……
頼むから釣りだけはカンベンしてくれ……
ただでさえ、アレなのが多いのにこんな肩すかしまで食らわされるとな。
0871nobodyさん03/06/26 00:39ID:???
>>870はいい人。
087286403/06/26 04:34ID:???
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
bakabakabakabakabakabakabakabakabakabaka
0873nobodyさん03/06/26 04:35ID:bmlG3tt5
EUCコードで書いているのですが、なぜか「当」という
文字が文字化けの原因となってしまいます。
具体的には、「当代島」と打つと、「套島」、「当島」と打つと
「島」となってしまいます。

入力フォームも間違えなくEUCなのですが、不明です。
どうかご教授いただけますでしょうか。
0874nobodyさん03/06/26 05:46ID:???
\当 びっくり。
0875nobodyさん03/06/26 09:17ID:???
>>873
そうなったPerlスクリプトを挙げよ。


0876nobodyさん 03/06/26 09:31ID:???
あと、漢字コードの変換モジュールあたりも書いとくほうがいい・・・
0877nobodyさん03/06/26 11:55ID:UmMKROoY
釣られage
0878nobodyさん03/06/26 12:17ID:???
また釣り?

当代島 - C5F6 C2E5 C5E7
套島  - C5    E5 C5E7

当島  - C5F6 C5E7
島    - C5    E7

なんか2バイト目と3バイト目が欠けてる気が。
0879nobodyさん03/06/26 12:46ID:???
箕島に遊びに行ったことを思い出す
0880nobodyさん03/06/26 13:41ID:???
と言いながら答えてる>>878はいい人
■ このスレッドは過去ログ倉庫に格納されています