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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/06/26(月) 00:46:38ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0759nobodyさん2006/07/20(木) 12:01:19ID:WCdGbBzj
linux上のperlで書いたCGIから、majordomoの設定ファイル(majordomo.cf)にアクセスさせようとしています。
ところが、openでエラーになります。

majordomoのファイルが

オーナー:mail
グループ:deamon
属性:777

なのが原因だと思うのですが、このファイルを上記条件から書き換えるようにするには、cgiのプログラム
からどのようにしたら良いでしょうか?
0760nobodyさん2006/07/20(木) 12:12:22ID:???
777で開けないなんて普通はないんだがな。openがエラーになってるとわかってるなら
$!の値も示せよ。
07617562006/07/20(木) 12:13:08ID:OwGfxror
誰もわかりませんでしょうかm(__)m
0762nobodyさん2006/07/20(木) 12:16:44ID:???
>>758
その理屈ならYAHOOは死刑になっちゃいそうな勢いだな。
あんな有名なサイトが無許可で他人のサイトのアドレスを晒しまくって。
とりあえず削除申請してこいよ。
07637562006/07/20(木) 12:24:17ID:OwGfxror
>>762
荒れるから止めて欲しいのですm(__)m
私あてのレスです。
本人である私がスルーしてるのですから、察してくださいませんか。

宜しくお願いします。
0764nobodyさん2006/07/20(木) 12:35:40ID:???
>>756
system('perl access.cgi');とか?
というか、そのaccess.cgiの返してくる画像は必要なんですか?
画像だけが、必要なら<img src="access.cgi">とか?
でも、そのくらい知ってそうっていう雰囲気ですよね・・・・・・・・
なんだろう・・・
07657562006/07/20(木) 12:46:10ID:OwGfxror
>>764
言葉足らずだったかもしれません。ごめんなさい。
access.cgiはアクセスログを取っていくcgiなんです。
test.cgiは今仮で作ってるアクセス解析cgiなんです。

test.cgiからaccess.cgiを呼びたいのは最新の情報を読みたいからなんです。
つまりaccess.cgi直後のaccess.logが一番精度が高いわけです。

秒単位で誰がどこにいるかを表示してますので意外と重要なのです。
ですからaccess.cgiからの戻り値はまるでいりません。
要はaccess.cgiに処理をさせればいいだけなんです。
それこそ最悪access.cgiの中身をtest.cgiに書いて解決です。あまりにひどい決着ですが。
返してくるgif画像自体はまるでいりません。

長文すみません。ご飯を食べてまいります。
0766nobodyさん2006/07/20(木) 13:09:01ID:???
架空のドメインを例示するときは予約されているexample.comとかexample.jpにするべきだと思うよ。
07677562006/07/20(木) 13:10:51ID:OwGfxror
>>766
exampleですね。ありがとうございます。
以後そういたします。
0768nobodyさん2006/07/20(木) 13:13:04ID:???
access.cgiの内容をモジュールにして両方から呼び出せるようにすりゃいい
その前になぜかむかつくんだがなんでだぜ?
0769nobodyさん2006/07/20(木) 13:20:02ID:???
しかもh○ge.comって実運用されてるんだからさぁ。
07707592006/07/20(木) 13:32:32ID:WCdGbBzj
$! は Permission Denied です。

権限の問題だと思うのですが・・・どうすれば処理できるでしょうか?
07717562006/07/20(木) 13:32:50ID:OwGfxror
>>768
呼び出したいがためだけにaccess.cgiに手を加えるのは避けたかったです。
他のケースのときでも全部そうなってしまうのは愚の骨頂みたいに思ってましたが
その認識が間違ってるのですかね。

ちょっとガッカリです。
0772nobodyさん2006/07/20(木) 13:37:48ID:???
requireじゃいけんの?
0773nobodyさん2006/07/20(木) 13:38:45ID:???
>>770
ファイル自体が777なのでそれは問題ないと思うから経由するディレクトリだろうな。
どういう風にパス指定しているのかは知らないが関係するディレクトリを全部確認してみ。

0774nobodyさん2006/07/20(木) 13:40:32ID:???
>>732
ちょい亀レスだがOpera10から完全にIEに偽装する機能が実装されてるよ
0775nobodyさん2006/07/20(木) 13:44:36ID:???
>>774
へぇ。Operaは何がしたいんだろう・・・・
そもそも偽装するなよって話だよな。製作者への嫌がらせとしか思えない。
製作者協会とかあればなぁ。ふざけた実装を排除していけるのに。

>>768
まあまあ。今日はなかなかすごしやすい気温なんだからおっとりしようぜ
0776nobodyさん2006/07/20(木) 13:46:18ID:???
>>775
逆にagent調べてIEじゃないってだけで門前払いなサイトもよくあるわけで、
どっちもどっちだね。
0777nobodyさん2006/07/20(木) 13:48:44ID:???
なんか俺がガッカリされたみたいだ・・・(´・ω・`)
07787562006/07/20(木) 13:55:49ID:OwGfxror
>>777
いえ、それは勘違いですよ・・・(´・ω・`)
0779nobodyさん2006/07/20(木) 13:58:35ID:???
XHTML+CSSで凝ったサイト作ろうと思ったことある奴なら
UAにIEを含んだらヤフにでも飛ばしたろとか思ったことあるはずだ
0780nobodyさん2006/07/20(木) 14:05:54ID:???
>>776
違うよ。
>>779
ん?なんか変だぞ?
そもそも「XHTML+CSSで凝ったサイト作ろうと」ってのがどうなんだろうか。
XHTMLやCSSは目的を果たすための一つの手段に過ぎないというのに、
その手段を目的としてるということは、何かを伝えたいんじゃなくて、使いたいだけという可能性もあるな。
それこそIEの挙動なんて無視すればいいじゃない。使いたいだけなんだから。

なんちゃって。人間がそれほど単純なら苦労はないよね。
やっぱり制作協会ってのがあればいいと思うんだよな。
0781nobodyさん2006/07/20(木) 14:08:55ID:???
なんか俺が勃起したみたいだ・・・(´・ω・`)
0782nobodyさん2006/07/20(木) 14:10:18ID:???
>>765
access.logの内容はIPとかUAとか時刻とかがずらずら並んだ状態ですか?
もしそうだったら、別にいつ読み込んでも、新鮮とか新鮮じゃないとか
関係ない気がしますが・・・
それとも、なんか特殊な、フォーマットのデータがaccess.logには含まれてるんでしょうか?
07837592006/07/20(木) 14:11:14ID:WCdGbBzj
アクセスしようとしているのが、

/usr/local/majordomo/lists/ なので上位全ての777にするのは気がひけます。
listsだけは 777 にしみましたが、同じエラーでした。

linuxのfs設定で何かあるのでしょうかねぇ?
07847562006/07/20(木) 14:14:40ID:OwGfxror
>>782
ありがとうございます。
ずらずら並んだ状態です。
アクセス時刻ももちろん並んでおります。アクセス時刻が一定を過ぎると削除し
リアルタイムで誰がどこにいるかをある程度特定するアクセスプログラムになっております。

ですので新鮮さは重要なのです。
でももう最悪の方法で片付けてしまいました。せっかくご親切に気に掛けていただいたのにすみませんです。
access.cgiの一部をそのままコピペしましたtest.cgiにorz
0785nobodyさん2006/07/20(木) 14:18:25ID:???
>>784
いや、まあ、それで正解だと思う・・・<貼り付け
そんな長くなさそうだし、
0786nobodyさん2006/07/20(木) 14:19:19ID:???
コピペするぐらいならその時点でカプセル化しとけ
また同じこと繰り返すことになるぞ
0787nobodyさん2006/07/20(木) 17:29:45ID:gqKAMnqO
どなたかお手すきの方いらっしゃいましたらお助けください

1)combbslog.cgiというファイルを一行読み込んで
$rl,$yl,$gl,$wl,$blにそれぞれの値を代入して
すべてが1より大きければ実行する。
プログラムを書いてみたつもりです。

ちなみにcombbslog.cgiの中身は


<>1<>3<>1<>1<>1<>

↑こんな感じです


2)open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
local(@file) = <IN>;
close(IN);
local($rl,$yl,$gl,$wl,$bl) = split(/<>/);

if(($rl > 1) && ($gl >1) && ($yl > 1) && ($wl > 1)){実行したい内容;}

3)とくにエラーなどは出ないのですが条件を満たしていても実行されません。

ファイルを読み込む当たりが良くわかっていないのでそのあたりがおかしいのではないかと思っています。
どこかおかしいところがありましたら教えてください。
0788nobodyさん2006/07/20(木) 17:38:15ID:???
データファイルに*.cgiという拡張子をつけるのはおかしい。

とりあえず
print $rl,$yl,$gl,$wl,$bl;
してみろ
0789nobodyさん2006/07/20(木) 17:44:06ID:???
>>787
if文の所。
>
の演算子の意味はわかってるよね?1には反応しないよそれじゃあ。2からだな
だからファイルの中身が全部2以上なら実行されるだろうね。
0790nobodyさん2006/07/20(木) 17:48:57ID:???
>>787
$rlの値がいつも空になると思うよ。

split(/<>/) だと
$rl<>$yl<>$gl<>$wl<>$bl<> こうでしょ。

>>788
> データファイルに*.cgiという拡張子をつけるのはおかしい。
( ´_ゝ`)・・・

>>789
すべてが1より大きければ実行する。ってことだからいいんじゃないの
07917892006/07/20(木) 17:53:54ID:???
>>790
よっ!さすがだな、おまい
07927872006/07/20(木) 18:00:12ID:???
こんなにも早くレスがついてるとは思いませんでした。

とりあえず全部2以上にしてみて
あと$rl<>$yl<>$gl<>$wl<>$bl<>にしてみますね

07937872006/07/20(木) 18:13:32ID:gqKAMnqO
レス下さったかたがたありがとうございます。
上記のことをやってみましたが出来ませんでした・・・
ためしに
print $rl,$yl,$gl,$wl,$bl;
しても何も表示されなかったのでどこか他のところがおかしいのかな?

以下にプログラム全文載せますので、もしよろしかったらまたお願いします。


-selectcol.cgi-

#!/usr/bin/perl --

open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
local(@file) = <IN>;
close(IN);

local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);

print $rl,$yl,$gl,$wl,$bl;

__END__

-combbslog.cgi-

1<>2006/07/20(Thu) 00:06<>blackh.gif<><><>北朝鮮がミサイルを発射することで国際社会からより疎外されている<><>127.0.0.1<><>1153321603<>2<>2<>2<>2<>2<>

0794nobodyさん2006/07/20(木) 18:17:11ID:???
>>788
  .r‐――'i   / > _         ,ノ~';;.    .....,,、 l´゙|゛           |´゙l゙        ,,,,,,,...... --、,
  . ̄ ゙̄} |  / ./ .;;./ '、         / ,./      ,! ./____| |__________、  ,,............-! !ー'''"゙.l     .ヽ --‐= /
  .r‐―" |'l゙_,,, ̄'i --、'ッ    / /      ./ ...........、 ,,................,!   ゙‐'ー''''''''''、 '.l゙´_,,,, 、      /./
  l |゙゙゙゙"'".._.... ! .|........ニ   / /       / /   ||       .l'''''''''''''''''''_.゛,,.... --′   ./ .イ-―ー 、
  ! .―--ィ .! .r‐''i .r‐‐i !  ..l ヽ.       ゙'/l'''''''''''''′゙'''''''''''''''i   `゙゙゙゙゙゙´゙_,゙,゙,,,,゙;;..\,    ./ ,..-''''^゙゙゙゙゙''''、 ヽ
  .゙‐'"^゙| ! .| .゙‐'''" !―" |    \ .\.       `゙゙゙゙゙゙゙゙゙| .!゙゙゙゙゙゙゙゙゙´    ,r'",, ---- ..,,/   < /        .| |
     .| ! .゙‐'゙゙゙゙゙! .!゙゙.l゙'│     .\. ゙'-,            ,! !        ! l゙              ゛       ._./ ./
  .,,,,,,,ノ !.r‐―ー" ゙''二、ヽ      .\ .゙>  .!^^^^^^^^^゛ `^^^^^^^^.!  .\`'''''''''''''''''''''>       'l'''''''''^゙゙_,,..-'゛
  .ゝ--‐゛ ゙‐''"゙ ̄´゛  `'´        `   . ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄゛    `゙゙''''''''''''''''"         ̄ ̄゛
0795nobodyさん2006/07/20(木) 18:19:15ID:???
この場合
local(@file) = <IN>;
ぢゃなくて
@_ = <IN>;
なら動くんで内科医?
0796nobodyさん2006/07/20(木) 18:19:15ID:???
良い悪いは別にしてデータファイルに*.cgiという拡張子をつけるのはおかしいだろw
あえてソコだったんだがただのかわいそうな人になってしまったw
0797nobodyさん2006/07/20(木) 18:20:27ID:???
>>796
おかしくないよ
他人に見せないためにも*.cgiにしたほうがいいと思うよ。
07987872006/07/20(木) 18:25:43ID:gqKAMnqO
またしても即答ありがとうございます。
>>795さんのいうとおりにしたら
error500

CGIエラー-Content-Typeヘッダが正しくありません。

とでてしまいました。これはどういうことでしょうか?
0799nobodyさん2006/07/20(木) 18:25:51ID:???
>データファイルに*.cgiという拡張子を付けることがおかしいだろw
おかしいと思う理由が知りたいんだが
0800nobodyさん2006/07/20(木) 18:27:34ID:???
combbslog.cgiのパーミッションは適切か確認汁
0801nobodyさん2006/07/20(木) 18:29:28ID:???
CommonGatewayInterfaceなファイルではないからおかしいという理論
っつーかもう触れないでくれw
どおりで俺の冗談には誰も笑わないわけだ
0802nobodyさん2006/07/20(木) 18:32:24ID:???
>>801
冗談にして逃げるわけねw
0803nobodyさん2006/07/20(木) 18:32:45ID:???
> local(@file) = <IN>;
> close(IN);

> local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);

$_ に何入ってんだよwww

foreach (@file) {
local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);
・・・
}

こうしたいんじゃねえのかい?
0804nobodyさん2006/07/20(木) 18:33:56ID:???
ああん更新し忘れた(ノ∀`)ペチ
0805nobodyさん2006/07/20(木) 18:34:18ID:???
>>798
print "Content-type: text/html\n\n";
を出力の前に入れないと駄目でしょ。

それと>>793が全文だとすると、sub error はいずこへ
0806nobodyさん2006/07/20(木) 18:35:10ID:???
>>802
逃げさせてくださいw
0807nobodyさん2006/07/20(木) 18:35:31ID:???
>>798
ブラウザでやってんの?

なら
つ【print "Content-type: text/html;\n\n"】
0808nobodyさんNGNG
突っ込み所が多すぎて
08097872006/07/20(木) 18:41:17ID:gqKAMnqO
はい、ブラウザでやってます。AN HTTPD というソフトでローカルチェックしてるところですから
パーミッションの設定はまだ関係ないですよね。
08107872006/07/20(木) 18:44:23ID:gqKAMnqO
突っ込みどころ多くて申し訳ないです。

>>803さんや>>805さんのとおりにしてみたらエラーは出なくなりました。
ただ何も出力されてきません。
0811nobodyさん2006/07/20(木) 18:48:34ID:???
デバック方法は自分で考えなよw

とりあえず
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
print <IN>;
close(IN);

とかからやってみたら。
あと無意味に local 使ってるのが kentくさくてイヤ。
08127872006/07/20(木) 18:51:54ID:???
>>811さん
  はい、デバックは自分で頑張ってみますね。
Kentさんのところをすごく参考にしていたのでそうなってしまいました。
08137872006/07/20(木) 18:55:45ID:gqKAMnqO
はやくもまた質問で申し訳ないのですが
ファイルを読み込むとき
最初の一行だけを読み込むとか出来ますか?
08147892006/07/20(木) 18:57:06ID:???
今日はみんな親切だな。
まあ雨がひどいからな。

0815nobodyさん2006/07/20(木) 18:58:03ID:???
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
$data = <IN>;
close(IN);
0816nobodyさん2006/07/20(木) 19:00:43ID:???
親切だなw

もう俺なら 「どこの講座でもいいから一回全部読んで来い」 っていう。 >>576 のでもいいから。
08177872006/07/20(木) 19:02:37ID:???
ほんとうに親切にありがとうございます。
雨の日でよかったです。
08187872006/07/20(木) 19:18:46ID:???
望んでいた事が出来ました!!
本当にありがとうございました。
花火大会を中止に追い込んだにっくき雨でしたが、
いまでは感謝しています
0819nobodyさん2006/07/20(木) 19:47:26ID:???
とかいって、回答者の実に半数は晴れでも出かける予定はなかったり・・・
0820nobodyさん2006/07/20(木) 19:56:23ID:???
ここまで話がはずんだのは>>788のおかげだとオモ
0821nobodyさん2006/07/20(木) 20:18:14ID:???
照れるじゃまいか
0822nobodyさん2006/07/20(木) 23:14:01ID:???
しかしあれだよな。
IE7って最高だな。
0823nobodyさん2006/07/20(木) 23:25:57ID:???
Acid2もクリアできないブラウザは嫌いだ
0824nobodyさん2006/07/20(木) 23:27:54ID:???
Perl7もたぶん最高
0825nobodyさん2006/07/20(木) 23:55:28ID:???
実装も存在しない言語は嫌いだ
0826nobodyさん2006/07/21(金) 01:52:13ID:VvqLR3Fu
コードの中で、自分自身が書かれている行数(行位置)を知ることはできるでしょうか。
例えば、「この文字列はindex.cgiの563行目で出力されました」と動的に出力できますか?
0827nobodyさん2006/07/21(金) 01:53:59ID:???
print __LINE__, "\n";
0828nobodyさん2006/07/21(金) 01:56:42ID:???

1: 自分は明日休みで暇だから・・・
2: なんかおまいらにコーディングの問題でも出して・・・
3: みようかな・・・

問題
・DATログをGrepして表示する
・検索語は任意の文字
・表示方法は100個づつ

最速コーディング達成者には妹の入浴画像を賞品(ry
0829nobodyさん2006/07/21(金) 02:00:29ID:???
>>827
おお!感動しました。そんな簡単にできたんですね。
エラー処理関数内でdieしたらデバッグの役に立たない行数がログに残るので
その対策をと考えておりました。ありがとうございます!
0830nobodyさん2006/07/21(金) 02:16:23ID:???
>>829
そういうことなら最後に改行を付けなさい。それで消えるから。
08318302006/07/21(金) 02:20:35ID:???
あ、ごめん。なんか凄い勘違いしたきがする。
呼び出し元の行をログに書きたいならcaller関数をあたると良い。後Carpモジュールも
0832nobodyさん2006/07/21(金) 02:24:01ID:???
あ、すみません、分かりづらくて。
丁度、callerを発見して感動して、その報告をしに来たところでした。
ありがとうございます!
0833nobodyさん2006/07/21(金) 03:50:54ID:???
ちょっと感動しすぎだろ
0834nobodyさん2006/07/21(金) 10:04:09ID:???
今日も雨だな・・・・
注文こねえかな
0835nobodyさん2006/07/21(金) 10:25:40ID:???
1.list.txtというファイルを読んで、一行ずつチェックボックスにするcgiを作ろうと思いました。
チェックされた項目は別ファイルに時刻付きで書き出すつもりでした。
2. ttp://marco.s4.xrea.com/cgi-bin/check/check.cgi
 を元にいろいろ変えて見てます。
3.入力フォームからpostでデータを渡して、表示上はどのチェックボックスもオンではないのに、
ブラウザをリロードすると、前にチェックされたデータが再度チェックされてます。
これは、どうしてでしょうか?
初心者で、不具合をうまく言えなくてごめんなさい。またこちらでの書き込みが不適切でしたら、該当スレをご教示いただければ有りがたく存じます。

下記は、ソースの一部分です。
print "<form action=$script method=post>\n";
print "<tr><td bgcolor=$page_color><font color=$bg_color>Check</font></td>\n";
print "<td bgcolor=$page_color><font color=$bg_color>項目</font></td></tr>\n";
open(LST,"$listfile");
@LIST=<LST>;
close(LST);
$cnt=0;
foreach (@LIST){
chomp($_); #chomp 行末の改行を削除
$cnt++;
print "<tr><td><input type=checkbox name=chk$cnt value=1";
print "></td><td><b>$_</b></td></tr>\n";
}
print "</table>\n";
print "<input type=hidden name=checkcnt value=$cnt>\n";
print "<input type=submit value=送信>\n";
print "</form>\n";
 
0836nobodyさん2006/07/21(金) 10:31:20ID:???
http://pc8.2ch.net/test/read.cgi/php/1143834740/
http://pc8.2ch.net/test/read.cgi/php/1141174205/
0837nobodyさん2006/07/21(金) 10:43:47ID:???
>>828
すまんが問題の意図が掴めん。

そして妹の入浴姿より姉の下着姿のほうがやる気が出る。
0838nobodyさん2006/07/21(金) 12:09:34ID:NKhAgGvd
本当にくだらないことで申し訳ないのですが、
入力されたURLが正しいURLかを判断するソースはどのようになるのでしょうか?
メールアドレスを判断するスクリプトは何とか分かるのですが、
URLとなると・・・どのようにしたらよいか・・・・
0839nobodyさん2006/07/21(金) 12:17:55ID:???
>>838
ttp://www.din.or.jp/~ohzaki/perl.htm#httpURL
まあここまでやらなくてもいいと思うが
0840nobodyさん2006/07/21(金) 12:19:14ID:???
>>838
>>9
テンプレの過去ログ部分うぜえな
0841nobodyさん2006/07/21(金) 12:25:52ID:???
「『URI』?ぷっ、それって『URL』のこと?『url』と『uri』見間違えてそのまんま覚えてやんのw」
とよくバカにされるんですが、どうしたら良いでしょうか?
0842nobodyさん2006/07/21(金) 12:30:03ID:???
>>841
スレ違い、そしてその人は無知
ttp://www.kanzaki.com/docs/html/htminfo-uri.html#uri
ttp://www.alib.jp/html/uri.html
0843nobodyさん2006/07/21(金) 12:31:22ID:???
まじめに説明するのは疲れるので相手を見て使い分け。
0844nobodyさん2006/07/21(金) 12:59:56ID:???
そして葛藤しろ
0845nobodyさん2006/07/21(金) 15:15:48ID:???
下のコードが無限ループになるのはなぜでしょう?

--ここから--
my $param = '123a456';
my $n = '';
for (;;) {
$param =~ s/[0-9]+//;
$n = defined($&) ? $& : '';
print 'debug $n='.$n.' $parm='.$param."\r\n";
last if ($n eq '') ;
}
print 'end';
--ここまで--

とりあえず for(;;0) のように第三パラメータになんでもいいから
突っ込めば $& が再評価されてループを抜けるのはわかったが、Bad
Know-How くさいので正しいコードを誰か教えて。
0846nobodyさん2006/07/21(金) 15:33:56ID:bw5ViySC
「スペース(全角・半角問わず)があれば、そのスペースも含めてそれ以降の文字列を全て除去」
というのを正規表現で書くとどうなりますか?
0847nobodyさん2006/07/21(金) 15:36:13ID:???
ちょっとは考えろ
こうやったけどこうなってできませんでした、とか
0848nobodyさん2006/07/21(金) 15:39:23ID:???
>>845
$&はThe string matched by the last successful pattern match なので
マッチしなくて置換が行われなかったときに値が変わるのを期待する方が
危険な気がする。s///は置換に成功したかどうかを返すのでそれで分岐
するのが筋じゃないかと。

forの第三パラメタがあったときに値が変わるほうがむしろ不思議だな。

どっちにしろ成功したパターンマッチのすぐ後以外のところでマッチ関係の
変数($<数字>とか$&とか)を使うのは怖いので自分ならしない。
08498462006/07/21(金) 15:49:32ID:bw5ViySC
考えてみたものの分かりませんでした。
$moji =~ s/ / /g;
my ($temp undef) = split(/ /,$moji);
08508452006/07/21(金) 16:05:32ID:???
>>848
サンクス
$& はマッチしなかった場合 undef になるというのをどっかで読んだんだが。
defined($&) の条件分岐はしないほうがいいてこと?でも for(;;0)のときには
ちゃんと評価されるのが謎なんだよな。
0851nobodyさん2006/07/21(金) 16:08:33ID:???
>>845
perl -MO=Deparse foo.plで for(;;) とfor(;;1)を比べてみたが、

for(;;)の方は単純に

while(1) { ... }

になるのに対して、for(;;1)の方は

while (1) { do { ... }; '???'; }

となってループ内の実行文がdo ブロックの中に入るかたちに
なっていた。このためfor(;;)の方では最後に成功したマッチが
456の置換になるのに対して、for(;;1)の方ではこのループに入る
前(一度もないのでundef)になるのだろうと思われる。

ちなみに、プログラムの先頭に 'hoge' =~ /.*/; を追加して
for(;;1)を試すと3回目からhogeになる。
08528452006/07/21(金) 16:35:45ID:???
ちょっと動作はちがうけど、これでいいのか。ありがと。
my $param = '123a456';
my $n = '';
while (1) {
last unless ($param =~ s/[0-9]+//);
$n = $&;
print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
0853nobodyさん2006/07/21(金) 17:08:27ID:???
普通whileに入れちゃうんじゃないかな
my $param = '123a456';
my $n = '';
while ($param =~ s/[0-9]+//) {
 $n = $&;
 print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
0854nobodyさん2006/07/21(金) 18:08:00ID:???
>>849
絶対こいつは考えてない
0855nobodyさん2006/07/21(金) 18:24:05ID:???
s/>>846|>>849//g;
0856nobodyさん2006/07/21(金) 18:49:30ID:???
>>846
s/\s.*//; かな? split を使うなら、第三引数に1がいいかも

>>853
my $param = '123a456';
while ($param =~ s/([0-9]+)//) {
 print 'debug $n='.$1.' $parm='.$param."\r\n";
}

$& を使うと全体が遅くなるから、キャプチャした方が良くない?
0857nobodyさん2006/07/21(金) 19:06:38ID:???
まあ速さについては前レス嫁ってことだなー。
0858nobodyさん2006/07/21(金) 20:22:51ID:???
cgiなのに速さ?
余程凄いもん作るわけ?

俺はちょくちょく書き換えるから最適なコードなんて求めない。
早く仕上げることの方が面白いしね。
漫画みたいにズダダダダダーって物事を進めていくのが面白いんだよ。

っていうか画像サイズとかをかんぺきにするだけでじゅうぶんだそ。
■ このスレッドは過去ログ倉庫に格納されています