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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん04/11/27 11:35:03ID:DJwiGeFM
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0892nobodyさん05/01/22 00:40:13ID:???
わかっちゃいるけど わかりません
スイスイスーダララッタ、スラスラスイスイスイ♪
0893nobodyさん05/01/22 09:44:47ID:e2M6eLer
自分のHPでTrackback Pingを受信したいのですが、

可能ですか?
089488005/01/22 10:18:03ID:6KUU/iOa
>>883
ありがとうございます。あの後自分のpcでppmで再インストールして関係のある
ファイルを確認しました。やはり揃っていたみたいで>>883の言うとおりにlibに
もう一つ渡したらperl -c では成功しました。

しかし何故かブラウザでは500エラーです。
ローカルではブラウザでもちゃんと動作するのに何が原因かわかりませんので、
とりあえずcarpモジュールに頼ってみましたが、何故かエラー内容を出力してくれません;
サーバはactiveperl5.8.1です。
BEGIN {
use CGI::Carp qw(carpout fatalsToBrowser);
carpout(STDOUT);
if ( defined $ENV{'REMOTE_ADDR'} && $ENV{'REMOTE_ADDR'} ne '127.0.0.1' ){
use lib サーバパス;
}else{
use lib ローカルパス;
}
}

宜しくお願いします。
0895nobodyさん05/01/22 10:40:15ID:???
>>894
CGI::CarpのfatalsToBrowserが有効になる前にエラーに
なってるのがいちばんありそうだな。置き方が悪いとか
#!〜のあたりがおかしいとか。

鯖のエラーログを見るのが一番早いと思うのだが。
0896nobodyさん05/01/22 10:48:00ID:???
BEGINルーチン内で制御構造使ってもuseはすべてコンパイルされるだろうに。。
089788005/01/22 10:54:56ID:6KUU/iOa
>>895
#!〜の部分は問題ないです。置き方が悪いかはわかりませんが、
既に稼動させてるCGIは5-6個ありますので、そのときと同じ手順ですので
問題ないかと思うのですが・・・

共用サーバでもエラーログってユーザごとにみられるんですか?
通常どこらへんにあるのでしょうか?

>>896
以前は@INCにpushしてた名残なのです。
089888005/01/22 11:14:58ID:6KUU/iOa
解決しました。
0899nobodyさん05/01/22 12:18:08ID:XoEEKIhN
掲示板を製作中なのですが、
入力フォームのテーブル幅の変え方(Perlに記述する$〜〜)
を教えていただけないでしょうか?

書き込んだ後の、表示される記事のテーブル幅の変え方は分かったのですが
入力フォームがどうしても分かりませんでした。

どうぞヨロシクお願いいたします
0900nobodyさん05/01/22 12:36:59ID:???
>>899
板違い
0901nobodyさん05/01/22 15:42:18ID:6KUU/iOa
例えば
/home/public_html/lib/
というフォルダの中に自作・他作モジュールが混在していて、
libフォルダのなかにもさらに色々なフォルダがあるとします。
中身はもちろんモジュールです。

そういうときに一発で@INCにlibディレクトリから下位層全てを加えるというような
命令を出したいのですが無理でしょうか?
use lib '/home/public_html/lib/';
これでは中のフォルダまでは認識されないみたいなので(windowsでは認識する?)。
いちいち
use lib ('/home/public_html/lib/','/home/public_html/lib/CGI');
などとしないといけないみたいで面倒です。libにオプションでも付けれるかと思いましたが、
perl.docにはそのようなことは書いてありませんでしたし。

エロイ人お願いします。
0902nobodyさん05/01/22 15:54:42ID:???
>>901
ここにはエロイ人はいません。
0903nobodyさん05/01/22 15:59:33ID:???
>>901
File::findとかでディレクトリ一覧を得てからpush
090490105/01/22 17:04:29ID:6KUU/iOa
>>903
ありがとうございます。
ところで
/home/usr/site/lib
などにあるPerlの標準付属モジュールなどはどうやって@INCに追加されているのでしょうか?

モジュールがインストールされたときに自動的にPerl本体のオプションファイル
みたいなものに書き込まれているんでしょうか?
0905nobodyさん05/01/22 17:11:46ID:???
>>904
エロイ人はhttp://sakura01.bbspink.com/hneta/に集まってます。
0906nobodyさん05/01/22 18:12:15ID:???
>>904
言われてみりゃ確かに気になるな・・・
090790105/01/22 19:03:50ID:6KUU/iOa
>>905
そういう意味ではないのですが;
>>906
@INCの中身を見る限りでは大元だけを登録していて、CGIフォルダなどの個別は
してませんよね。
かわりに
multi treed ...なんとかっていう文字がくっついてるんですよね。

それを付けることによりUNIXがこのファイルより下位層という意味を
汲み取っていたりするんですかね?
0908nobodyさん05/01/22 19:07:38ID:???
いいかげんスレ違い

Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
0909nobodyさん05/01/22 19:32:17ID:???
>>904
perl.cのS_init_perllib()関数で定義してる模様。
実際の各定数(ARCLIBとか)は環境によって定義するファイルが異なっている。

/win32/config_H.vc(win32 VC用?)では
#define ARCHNAME "MSWin32-x86-multi-thread"/**/
のように定義されてる。
0910nobodyさん05/01/22 19:48:29ID:???
質問です
localtime関数で得た時間を配列に代入し、昔に同じようにして配列に代入した値から時間差を秒単位求めたいのですが、
掛け算しまくって秒になおすのを考えたのですが、ほかにもっと良い方法はありませんか?
0911nobodyさん05/01/22 20:09:34ID:???
>>910
timelocalでUTCに戻して引き算
0912nobodyさん05/01/22 20:33:20ID:???
>>910
そもそもlocaltimeに渡す前の値をとっとけば引き算するだけで良かったのにね。
後悔先に立たず。
0913nobodyさん05/01/22 21:12:15ID:???
え、localtime使わずに時間を求める方法があるんですか?
0914nobodyさん05/01/22 22:07:43ID:???
そこは驚くところなのか...

time() を教えずに localtime() だけを教えている書籍やWWWページが
結構ありそうだな
0915nobodyさん05/01/22 23:03:28ID:???
timeとlocaltimeの説明を読めばわかるが、現在時刻を
求める関数はtimeで、これはいわゆるunix timeという
1970年1月1日0時0分0秒GMTからの秒数を返す。こっちの
方が足し算引き算もそのままできてコンピュータには
扱いやすい。

しかしそのままでは人間には扱いにくいので見慣れた
年月日時分秒に分解してくれるのがlocaltimeと
いうわけだ。こっちは本来はlocaltime(<unix time>)
という形で引数を与えて使うのだが、式を省略した
ときはtimeの値(=現在の時刻)が与えられたことに
なる。

というのをはしょってlocaltimeだけ教えられるとこう
いう悲劇を生むのだろうなぁ。
0916nobodyさん05/01/23 00:00:38ID:???
うわ、全然知りませんでした
思いどおりにできました
分かりやすい解説ありがとうございました
0917nobodyさん05/01/23 00:38:29ID:vqv+/2ig
初めてperl書いてみました。
簡易的な計算のプログラムを作ってみたんですがうまく動作しません。

ちょっと見て頂き、不具合等御指摘下さい
特定の計算式で、入力(1項目だけセレクトボックスにより選択)した数値を計算するものです。


ソース
http://tool-ya.ddo.jp/2ch/trash-box/contents.jsp?file=20050123003423509.txt

URL
http://sr-cafe.chu.jp/kok/calc.html
0918nobodyさん05/01/23 00:43:17ID:???
>>917
スレ違い

自作CGIを評価するスレ
http://pc5.2ch.net/test/read.cgi/php/1049514428/
0919nobodyさん05/01/23 00:44:46ID:???
>>918
すいません。
ソチラ行ってまいります。
0920nobodyさん05/01/23 18:54:50ID:5kSUsj4g
以前他レスで質問したのですが、未だに解決できません。
どなたかお願いします。

htmlのページから
< a href="abc.cgi">A氏</a>
< a href="abc.cgi">B氏</a>
というようなリンクでabc.cgiを呼び出した時、abc.cgi側で、
A氏、B氏のどちらのリンクで呼び出されたかを判断するに
は、どうすれば良いでしょうか?A氏で呼ばれた場合と、B氏
で呼ばれた場合で処理を変えたいのですが。。

という質問に対して、
< a href="./abc.cgi?name=A">A氏</a>
< a href="./abc.cgi?name=B">B氏</a>
という回答を頂いたのですが、
abc.cgi側で、このAとBをどのように参照してよいか分かりません。
フォームの値とかは$name = $form{'name'};という感じで変数に
代入して参照できると思うのですが、上記の場合はど記述すれば
よいでしょうか?
0921nobodyさん05/01/23 19:31:33ID:???
>>920
>>858
0922nobodyさん05/01/24 00:14:08ID:???
>>920
どこに入っているかといえば、
$ENV{'QUERY_STRING'}の中に入っている。
0923nobodyさん05/01/24 10:28:19ID:Yl+XYDvu
sendmailを使って6通連続同一相手(携帯電話)に送信するスクリプトを書いたのですが、
連続送信すると携帯キャリアによっては全部受信するまでに1日近くかかってしまいます。
このスクリプトはメルマガを携帯用に分割して送信するためのものなのですが、
何とか正常に受信できるようにしたいです。

少し感覚を空ければ多少はマシになるかなと思うのですが、Perlでは
プログラムの実行中に「1分間停止」みたいな命令はだせないのでしょうか?
0924nobodyさん05/01/24 10:41:34ID:Yl+XYDvu
sleep!
0925nobodyさん05/01/24 10:46:31ID:???
うむ sleep

ただし cron か何かで起動するならいいが、
CGI で実行中に1分も sleep すると
タイムアウトで kill される恐れがあるので
気を付けてな
092692305/01/24 13:54:19ID:Yl+XYDvu
>>925
それは知りませんでしたm(_ _)m
とりあえず10秒ずつ休ませるだけで問題なく受信できるようになりましたので、
大丈夫だと思います。
0927nobodyさん05/01/24 14:38:48ID:KnbcSRWW
$test{"hoge.hage"}
$test{"hoge.hage.2ch"}
$test{"hoge.hage.3ch"}
$test{"qwerty.foo"}
$test{"shige.hage"}

…というような、キーをドット区切りの組み合わせにした連想配列を使っているのですが
キーの頭が共通のものを一度に削除する方法はあるんでしょうか?
上の例だと$test{"hoge.hage"}、$test{"hoge.hage.2ch"}、$test{"hoge.hage.3ch"}
を削除する方法です。
092892305/01/24 14:45:29ID:???
>>927
foreach ( keys %test ){
delete $test{$_} if $_ =~ /^hoge/;
}
0929nobodyさん05/01/24 15:15:44ID:KnbcSRWW
>>928
ああ、そんな方法があったんですね!ありがとうございます。

ついでに連想配列のキーは数千単位(或いはもっと)であるのですが
速度や効率の面ではどの程度から気にすべきでしょうか?
0930nobodyさん05/01/24 15:28:07ID:???
あ、もしかしてこの方法だと
$test{"hogegege.hage"}
$test{"hogehage.hage"}
のようなhogeを含むものを全部消してしまいますかね?
正規表現で対応すればいいのかな。

#実際のプログラムだと不特定の数字を使っているので
#1と11と111が出てきたりします
0931nobodyさん05/01/24 16:09:11ID:???
正規表現でいいんじゃないのかね。
あとスライスをまとめてdeleteした方が速いかも。

delete @test{grep /^hoge\./, keys %test};

とか。

あるいは$test{'hoge'}->{'gege'}->{'hage'}の
ようにすれば delete $test{'hoge'} 一発だけど
他の処理のからみもあるので大局的にこれがいい
かどうかはわからん。
0932nobodyさん05/01/25 00:00:05ID:???
sub X{
if(X()){ return; }
if($a == 0){
A; X(); B; X(); C; X(); D; X();
$a = 1;
}elsif($a == 1){
E; X(); F; X(); G; X(); H; X();
$a = 2;
}elsif($a == 2){
・・・・・・・・・・・
}
return;
}

これを実行するとBの直後でsub Xに戻るとA→B→C→D→C→Dと
実行されなかった部分が繰り返されてしまうんですが、
最後の実行されなかったC→Dは繰り返さずに
A→B→C→Dだけまた繰り返すにはどうしたらいいんでしょうか?
returnの数や位置がいけないのかな・・・必ず残った分が実行されてしまうんです。
なにとぞご教授の方よろしくお願いします。
0933nobodyさん05/01/25 00:17:27ID:???
無限に再帰しようとしてるようにしか見えないのだが釣り?
0934nobodyさん05/01/25 00:32:09ID:???
>>933
釣りじゃないんす。
まじで初心者なもんで原因が分からないんで教えてください。
X();はある障害が起こってないか常に確認をする為にこまめに入れてます。
ABCDEFGH....と順調に動作させたいんですが、
もし障害のXが起きたら$aの値の最初に戻って繰り返しをしたいんですが・・
0935nobodyさん05/01/25 01:46:48ID:???
ここまで目が腐るコード久しぶりに見た。
>>934 お前これ実行した事ねーだろ。
093693205/01/25 02:24:52ID:???
>>935
色々試して何度も実行してますが、解決法が分かりません。
知識0に近い状態からこういうものを作らなければいけなくて
lastとか入れたり色々試したんですがダメで何日も苦闘してます。
初心者って書いてあったんで最終的に質問してみたんですが、
ダメデスカ…。
0937nobodyさん05/01/25 02:31:44ID:???
問題が抽象的な上に何をやりたいのかがわかりにくい。
それ以前に

>sub X{           # ← X の中で
>if(X()){ return; }     #   いきなり X 呼んだら無限ループになるだろ
093893205/01/25 02:46:47ID:???
すみませぬ。書き方がよろしくなかったです。
丸い物体が迷路を進むものでテンキーの2468で前後左右に進んで
それをsendKeyで送って進みます。

sub X{     
if(cmpBmp(X, Y, "$DIR/abcチェックポイント.bmp")){ return; }

チェックポイントの黄色い点を画像認識でマッチングさせてそこで
つっかかってるようなら最初$aの値に戻るっていう風にしたいんです。
画面内でつっかかると自動的にstart位置に戻ります。
でもこの場合、Bの直後に戻ってもABCDCDのように残った部分もループしてしまって
うまく迷路を進むことができず、結局次のEの地点まで行けないのです。
0939nobodyさん05/01/25 02:50:22ID:???
動かんコードを「動くようにして」っていう質問はスレ違いだからね。
0940nobodyさん05/01/25 04:17:51ID:???
>>938をどう書き換えたら>>932のコードになるんだ?
0941nobodyさん05/01/25 04:59:16ID:???
>>932
やりたい事は分かった。
要はマッチングの部分と一連の流れを一つにまとめてサブルーチンにしたいわけだな?
それも別の場所でも使うと。

そ れ は 無 理

もっとスリムに書く方法があるべ?ほら。もっと簡単に思いつくぞ?
094293205/01/25 05:23:55ID:???
>>937
ですよね・・ヒントありがとうございます。

>>939
スレ汚し失礼しました。

>>941

>要はマッチングの部分と一連の流れを一つにまとめてサブルーチンにしたいわけだな?
>それも別の場所でも使うと。

はい、その通りなんです。でもやっぱ無理なんですね。
他に方法・・・思いつきませぬ。。
とりあえずサブルーチンの事は後に置いといて考えてみます。
どうもでした。
0943nobodyさん05/01/25 23:39:11ID:???
2005年版パンチ3/5か?
0944nobodyさん05/01/25 23:42:52ID:???
平凡パンチ
0945nobodyさん05/01/26 12:09:54ID:???
久しぶりにココに来た。
テンプレがめっちゃ少なくなってる。
テンプレ見に来たのに。
なんでやねん。
しかもム板のコピーだし。

さらに932はム板でもわけの分からん質問してるし。
ほとんどマルチだし。
なんでやねん。
0946nobodyさん05/01/26 12:13:41ID:/LVNqA6M
携帯電話用HTMLに変換するスクリプトを作ってます。
<body>以前と</body>以降を取っ払って、
一行ずつ、「img要素を画像へのリンクに置き換える」などの処理を与える、という処理をさせて、

push(@dat,"$data\n");

で@配列に放り込んで、

print "@dat[$lines..$line]";

で表示という仕組みにしているのですが、
($lines..$line は、文字数などで計算して18kbで収まるようにしてる部分で、この部分はうまく動作しています。)

ソース表示で見てみると、各行文頭に半角スペースが二つ入っているんです。

@配列に入れる直前に、
$data = substr($data,3);
と、前2byte分削ってみたら<h1>foo</h1>がh>foo</h1>になってしまいました。

普通に使う分には問題ないですが、
pre要素でのマーク付けの際は、
<pre>foo
bar
hoge</pre>
のbar、hogeそれぞれの文頭の半角スペース二個が描画されてしまいます。

原因わかる方、お教え願います。
0947nobodyさん05/01/26 12:31:24ID:???
>>946
処理の要所要所でprintしてどこで混入してるか発見したまへ
0948nobodyさん05/01/26 12:46:04ID:???
配列を""で囲んでるのが原因でないの
0949nobodyさん05/01/26 12:59:38ID:???
>>947
それが一番の早道ですよね。
@に入れる直前の時点では文頭の半角スペースがなかったようなので、よくわかりません。

>>948
$a = @a
とすると、配列の行数が出るので、""で括らなきゃいけないと思い込んでました。
とったら一個減りました。

あと一つなんですが、もうちょっと頑張ってみますです。

有難う御座いました。
095094605/01/26 13:05:30ID:???
解決しました。
どこでかわからないんですが、文頭に半角スペースが入ってました。

>>947
「@に入れる直前の時点では文頭の半角スペースがなかったようなので」
とか間違った生意気な発言をしてしまい申し訳ありませんでした。
念のため、もう一度試してみたら見付かりました。

有難う御座いました。
0951nobodyさん05/01/26 13:21:00ID:???
文字列リテラルに配列埋め込む意味とか、printにリスト渡す意味とか
全く理解しないで書いてる香具師が多いってことなのかねぇ...

095294605/01/26 13:44:53ID:???
>>951
私、ですか?
私が@配列に入れた理由は、

header

body中身

footer

のbody中身を18KBで分割するために、@配列に入れました。

なんかおかしいでしょうか?
全て独学なので、間違った使い方をしている可能性は高いですが。
0953nobodyさん05/01/26 16:15:11ID:???
【これまでのあらすじ】
サイト構築に際して重要なのは「構造」か!?「内容」か!?はたまた「理念」か!?
お馬鹿なWEB職人達の寒い議論は今日も止まらない。

ものすごろく頭の悪い発言をしてくさい5
http://pc5.2ch.net/test/read.cgi/hp/1106209097/105-
0954nobodyさん05/01/26 16:28:44ID:???
>>952
たとえば文字列リテラルに配列を埋め込むことについては
perldata(1)に

配列変数は、ダブルクォート文字列中で、配列のすべての要素を変
数 $" 中に示す区切文字 (デフォルトはスペース) でつなげて展開
されます。 以下は同値です:

$temp = join($",@ARGV);
system "echo $temp";

system "echo @ARGV";

と説明されているのだが、これを理解していればそのような間違いは
普通しないし、仮にやってしまったとしてもおかしいと分った段階で
これに思い当たりそうなものだということ。
0955nobodyさん05/01/26 21:54:26ID:???
>>954
読んでいないKヨNTの類が悪の枢軸。
0956nobodyさん05/01/26 22:18:17ID:NprQarfg
有難う御座いました。
095794605/01/26 22:47:36ID:???
>>954
理解以前にそれ、読んでませんでした。
なんとなく始めて、なんとなく出来上がったので、
問題にぶち当たってから調べる、という非効率的な学習の仕方をしてました。

一度、ちゃんと仕様とか読んだ方がよさそうですね。
0958nobodyさん05/01/27 02:43:34ID:???
糞ソースを見たら
「KEN丁のせい」と思え
095994605/01/27 03:44:05ID:???
>>958
私、ですか?
人のソースは見てないのでわかりません。
0960nobodyさん05/01/27 07:05:12ID:???
配列をダブルクォートで展開すると$"が挟まるのは、初心者には予想できないだろうと思う。
特殊変数がきちんと解説されている本やサイトって少ないしね。
0961nobodyさん05/01/27 08:27:17ID:???
スカラー変数を出力するときに
print $hoge,"\n";
print $hoge."\n";
みたいな書き方もあるけど、
print "$hoge\n";
って書いたほうが単純で分かりやすい。

たぶんこういう記法に慣れてるせいで、リストの時も同じような書き方をしてしまうんだと思う。
0962nobodyさん05/01/27 11:29:00ID:???
ヒアドキュメントでよくEOMって使われてますが
これって何かの頭文字ですか。
0963nobodyさん05/01/27 12:38:56ID:???
EOT: End Of Text
EOD: End Of Data

ならわかるがEOMはしらん
0964nobodyさん05/01/27 12:48:59ID:???
EOL: End of line
EOF: End of file
EOM: End of message
0965nobodyさん05/01/27 12:50:02ID:???
>>963
なんつー中途半端な回答するんだw
096696205/01/27 13:02:45ID:???
なるほどそうですか。ありがとうございました。
でもそうなると「EOMで挟む」っぽい構造になるのが気持ち悪いですね。
見た目的に。
0967nobodyさん05/01/27 13:36:33ID:???
つ [EOE the End Of Evangelion]
0968nobodyさん05/01/27 13:37:26ID:???
>>966
理解が浅い。
EOMまで、と宣言してEOMの場所を明示しているんだよ。
気持ち悪くない
0969nobodyさん05/01/27 14:54:27ID:???
>>966
自分の視認性を考えたらそのヒアドキュメントに名前をつける、という感覚の方が、
あとでメンテするときも楽だと思うのだが、そんな俺の発言は余計な御世話だったと思う。
0970nobodyさん05/01/27 15:56:03ID:ZopGQTdq
$a = qq|<center>hogehogehoge<br>hogehogehoge<br></center>
あいうえお<br>kakikueko<br>
|;

$aの中のものを置換したいです。
<center>は<CENTER>に
</center>は削除
<center>..</center>内の<br>は<BR><CENTER>に
<center>..</center>外の<br>は<BR>

こういうのをしたいんですが正規表現で一発では無理ですか?
0971nobodyさん05/01/27 16:04:03ID:???
>>970
アホな漏れはつい
$a =~ |(<center>.*?)<br>(.*?</center>)|\1<BR><CENTER>\2|g;
とか考えたが、これじゃあ<br>が一個以上だとダメだなw

正規表現では無理じゃない?<center>(*.?)</center>こうしてから
$1 =~ s|<br>|<BR><CENTER>|g;
ってやって元の場所に突っ込むとかは?

あ、元の場所に突っ込みようがないか?
0972nobodyさん05/01/27 16:07:21ID:???
>>970
$a =~ s|<center>(.*?)</center>|<CENTER>@{[\1 =~ s/<br>/<BR><CENTER>/]}</CENTER>|g;
とかでどうだ?

今は試す環境がないからなんともいえないが
0973nobodyさん05/01/27 16:16:54ID:???
>>970
パズルとしてはおもしろいのかもしれないが、
メンテしにくくなるだけなので素直に順を追って
複数回に分けて置換した方がいいと思うぞ。
097497005/01/27 16:19:43ID:ZopGQTdq
$a = qq|<center>hogehogehoge<br>hogehogehoge<br></center>
あいうえお<br>kakikueko<br>
|;

@a = $a =~ m|<center>(.*?)</center>|;
$_ =~ s|<br>|<BR><CENTER>|g foreach @a;
$a =~ s|<center>(.*?)</center>|<CENTER>@a|g;

一応できました。不備があったらお願いします。
それともっといい方法がありましたらお願いしますm(_ _)m
0975nobodyさん05/01/27 16:22:24ID:???
>>974
・・・・・・漏れよりできる人なのねorz
恥ずかしくなってきた;

一応
$a =~ s/<br>/<BR>/g
が最後に足りてないよ・・・と^^;
気付いてるんだよねきっと

しかし漏れがなんとか1行でやってみせる。15分だけr時間をくれ。
097697005/01/27 16:27:33ID:ZopGQTdq
あ・・・・
全然ダメでした。

正規表現のgオプションを使っている時って「今何回目」という
情報をもっていないのでしょうか?
0977nobodyさん05/01/27 16:50:36ID:???
「%%」という文字列を内部処理でアラーム(\a)に位置変換し、
最後にまた「%%」へ戻すようにしているのですが、日本語等で
アラームが使われるようなことはありますでしょうか。

あるとその文字の一部も「%%」になってしまうのでどうしようか
考慮しております。

ご教授いただけますと幸いです。
0978nobodyさん05/01/27 16:54:14ID:???
駄目だ。
eオプション使えば1行でいけそうなのに、後一歩でできなかった。

>>976
よかったら役に立てて下さい。
$a =~ s|<center>(.*?)</center>|"<CENTER>",$1=~s/<br>/<BR><CENTER>/|eg;
$a =~ s/<br>/<BR>/g;

$1を置換してそのまま置換後文字列を埋め込む方法がわからなかったorz
0979nobodyさん05/01/27 17:37:33ID:???
質問させてください。

ショッピングカートのCGIを配布しているのですが、
MacOS9とIEの組み合わせだとバグが出てしまうという指摘を受けました。
商品が11種類以上になるとバグが出るそうです。
Winの場合、もしくは商品が10種類以下の場合は正常に動きます。

MacのIEだとperl内での変数の処理が特殊である場合などがあるのでしょうか。
例えばforeachを使ったときに「$_」の値が正しく認識されない、
等のバグなどがあるのでしょうか。

もしもあるのだとしたら、Macとそれ以外のOSの動作の違いなどを
解説したサイトがありましたら教えていただけると嬉しいです。
よろしくお願いします。
0980nobodyさん05/01/27 18:00:01ID:???
>>979
CGIの場合、perlは鯖の中で動きます。
そして出力内容がブラウザに返されて表示に使われるわけです。
従ってperlは無罪です。
バグつーのが何を指してるのか一切情報が提示されて無いのでアホかと思いますが、
不都合が生じる際の入出力の差異(GET・POST値、cookie HTTPヘッダ等)や
JavaScriptを利用しているならその解釈の差異を確認するのが解決の糸口になると思われます。
以降は別スレ或いは別板で質問するのが適当でしょう。
0981nobodyさん05/01/27 18:07:38ID:???
次スレ立ててくる
0982nobodyさん05/01/27 18:12:29ID:???
【次スレ】

Perlコーディング初心者質問スレ Part 40
http://pc5.2ch.net/test/read.cgi/php/1106816922/
0983nobodyさん05/01/27 18:21:10ID:???
>980
手のつけようの無いバグで焦ってしまっていましたが目が覚めました。
言われてみればその通りです。

GET・POST値の差異というヒントをいただけただけでもとても助かりました。
ありがとうございます。
0984nobodyさん05/01/27 18:24:12ID:???
よくそんなレベルで配布なんかするよなー。
しかもショッピングカートをきたもんだ。
((((;゚Д゚))))ガクガクブルブル
0985nobodyさん05/01/27 18:32:32ID:???
配布元がこれだと大変だな。
0986nobodyさん05/01/27 22:10:38ID:???
>>977
\aはコントロールコードだから、どの文字コードの漢字もかからないよ。
0987nobodyさん05/01/27 23:15:51ID:???
コーディング以前にいいアルゴリズムが思い浮かばん
0988nobodyさん05/01/27 23:16:14ID:???
>>970
my $center = '';
$a =~ s{(</?center>|(<br>))}{uc(($2 or $center = $1 eq '<center>' ? $1 : '', '').$center)}ge;
0989nobodyさん05/01/27 23:33:37ID:???
my $center = '';
$a =~ s{(<(/)?center>)|(<br>)}{uc(($3 or $center = $2 ? '' : $1, '').$center)}ge;

こっちの方がいいか。
0990nobodyさん05/01/28 02:30:31ID:???
>>986
ご返答有難うございます。
安心して使うことができました。
099197005/01/28 09:30:02ID:dK9OtT7G
>>989
それはどうなってるのでしょうか?
はじめに<center>を見つけると$center=<center>をして、
その後の<br>発見では自動的に<BR><CENTER>への変換。
</center>を見つけると$center=''で$centerが空っぽになる。
その後<br>を見つけると<BR>.''のようになる。

つまり<center>..</center>ないの<br>という捉え方ではなく
<center>がでるとフラグonで、</center>がでるとフラグoff。
状態情報を保有させてる感じなんですね。面白いですね。

1つわからないんですが$1,''の部分の''は何の役割があるのでしょうか?
これがないと確かに動作が変わるみたいですが・・・・・・どういう意味なのか
どういう瞬間に使われているのかわかりません。

もしよろしければご教授お願いします。
0992nobodyさん05/01/28 11:18:24ID:???
>>970
ストリクタンとしては、

どっちも使うなよ

って言いたいの
レス数が950を超えています。1000を超えると書き込みができなくなります。