あー、Perlわがんね
1投稿者:三河人  投稿日:2001年06月28日(木)00時43分02秒 |
難しーなー。相変わらず。何方かヒント教えて下さい。
えーと、
<a href="http://aaa.com/">http://aaa.com</a>
<a href="http://bbb.com/">http://bbb.com</a>
<a href="http://ccc.com/">http://ccc.com</a>
とログにあるタグを取り除きたいのですが、単純に
s/<a href=(.+)\">//;
s/<\/a>//;
としますと、結果は
http://ccc.com/
だけになってしまいます。
s/<a href=(.+)\">//;指定でhttp://ccc.com/の直前までが
全部対象になっているからですね。

なんとか
http://aaa.com/
http://bbb.com/
http://ccc.com/
の状態にしたいのですけど…。
2投稿者:こんなんでどうかなあ  投稿日:2001年06月28日(木)06時10分38秒 |
と。良く分からんが…。
s|<a href=[^>]+>(.+?)</a>| と。良く分からんが…。
s|<a href=[^>]+>(.+?)</a>|$1|g;
|g;
3投稿者:三河人  投稿日:2001年06月28日(木)12時15分05秒 |
あ、そうかあ…。
2さんのような方法も考えたのですが、スクリプトが結局解らなかったので
断念してました。
これなら「(.+?)= あ、そうかあ…。
2さんのような方法も考えたのですが、スクリプトが結局解らなかったので
断念してました。
これなら「(.+?)=$1部分」の抽出が可能っぽいですね。
参考にして試してみます。ありがとうございました。 部分」の抽出が可能っぽいですね。
参考にして試してみます。ありがとうございました。
4投稿者:三河人  投稿日:2001年06月29日(金)03時17分33秒 |
>2さん
出来ましたー。ありがとうございました。
発想の転換が必要なんだな。
5投稿者:su  投稿日:2001/09/27(木)02:39:37
しかし、Parlって、他人の書いたコードは暗号に近い・・・
6投稿者:三河人  投稿日:2001/09/27(木)12:07:49
>5のsuさん
>しかし、Parlって、他人の書いたコードは暗号に近い・・・

言えてますね(笑)
100行を超えるとちょっとやばくなります(超えるソースばっかですけど)
インタプリタ言語の宿命かもしれません。
7投稿者:三河人  投稿日:2001/11/13(火)01:00:34
あ”−−−!!わがんね!!(笑)

$aaa =~ /<b>(.+?)<\/b>(.+?)<!-- TEST:(.+?) -->/;
$bbb = あ”−−−!!わがんね!!(笑)

$aaa =~ /<b>(.+?)<\/b>(.+?)<!-- TEST:(.+?) -->/;
$bbb = $1;
$ccc = $3;

としますと、$bbb や $ccc の値が取れたり取れなかったりしてしまいます。
取れない条件は、$3の値が無い時に、$1も値が無くなってしまいます。
$3の値は無い場合があるのですが、$1については必ずあるのに…。
なんででしょ…?
どなたか教えて下さい。;
$ccc = ;

としますと、$bbb や $ccc の値が取れたり取れなかったりしてしまいます。
取れない条件は、の値が無い時に、あ”−−−!!わがんね!!(笑)

$aaa =~ /<b>(.+?)<\/b>(.+?)<!-- TEST:(.+?) -->/;
$bbb = $1;
$ccc = $3;

としますと、$bbb や $ccc の値が取れたり取れなかったりしてしまいます。
取れない条件は、$3の値が無い時に、$1も値が無くなってしまいます。
$3の値は無い場合があるのですが、$1については必ずあるのに…。
なんででしょ…?
どなたか教えて下さい。も値が無くなってしまいます。
の値は無い場合があるのですが、あ”−−−!!わがんね!!(笑)

$aaa =~ /<b>(.+?)<\/b>(.+?)<!-- TEST:(.+?) -->/;
$bbb = $1;
$ccc = $3;

としますと、$bbb や $ccc の値が取れたり取れなかったりしてしまいます。
取れない条件は、$3の値が無い時に、$1も値が無くなってしまいます。
$3の値は無い場合があるのですが、$1については必ずあるのに…。
なんででしょ…?
どなたか教えて下さい。については必ずあるのに…。
なんででしょ…?
どなたか教えて下さい。
8投稿者:名捨て人  投稿日:2001/11/13(火)14:09:52
$aaa =~ m|<b>(.+?)</b>(.*?)<!-- TEST:(.*?) -->|;

必ずある訳ではない場合は+じゃなくて*を使うとよさそうですです。
9投稿者:三河人  投稿日:2001/11/13(火)17:21:46
>8の名捨て人さん
>$aaa =~ m|<b>(.+?)</b>(.*?)<!-- TEST:(.*?) -->|;
>
>必ずある訳ではない場合は+じゃなくて*を使うとよさそうですです。

おお、それは知りませんでした。
さっそく試してみます。ありがとうございました!!
10投稿者:名捨て人  投稿日:2001/11/13(火)18:34:19
$aaa =~ m|<b>(.+?)</b>(?:.*?)<!-- TEST:(.*?) -->|;
$bbb = $aaa =~ m|<b>(.+?)</b>(?:.*?)<!-- TEST:(.*?) -->|;
$bbb = $1;
$ccc = $2;
</b>の後にある2番目の()を使わないなら、こうの方がよさげですです。
メモリの節約ですです。;
$ccc = ;
</b>の後にある2番目の()を使わないなら、こうの方がよさげですです。
メモリの節約ですです。
11投稿者:三河人  投稿日:2001/11/13(火)23:36:28
>10さん
おお、ほんとだー!!
>>8のスクでも出来ましたが、>>10のスクでも正しく出来ました。
ありがとうございました。多謝。

でもなんででしょ…?
(?:.*?)の部分がてっきりになるように思えたのですが。
↑この記述ですと無視されるのでしょうか。
()で括ったら全て$nとして判定されるとばかり思ってました。
12投稿者:三河人  投稿日:2001/11/13(火)23:40:21
つーか今回の件で、私の知らない方でPerlに詳しい人が
わんさか居るという事が解りました(笑)
みんな凄いなあ…。
13投稿者:名捨て人@深夜です  投稿日:2001/11/14(水)00:36:18
()は文字のグループ化とメモリで、
それが変数()は文字のグループ化とメモリで、
それが変数$1,$2,$3...に入るんですが、
(?:xxxxx)はメモリを使わないかっこというヤツですです。(/д`)
ちなみにPerl5用です。,,...に入るんですが、
(?:xxxxx)はメモリを使わないかっこというヤツですです。(/д`)
ちなみにPerl5用です。
14投稿者:三河人  投稿日:2001/11/14(水)01:18:13
>13の名捨て人@深夜です さん
>()は文字のグループ化とメモリで、
>それが変数>13の名捨て人@深夜です さん
>()は文字のグループ化とメモリで、
>それが変数$1,$2,$3...に入るんですが、
>(?:xxxxx)はメモリを使わないかっこというヤツですです。(/д`)
>ちなみにPerl5用です。

なるほどー。毎度毎度の説明ありがとうございました。,,...に入るんですが、

>(?:xxxxx)はメモリを使わないかっこというヤツですです。(/д`)
>ちなみにPerl5用です。

なるほどー。毎度毎度の説明ありがとうございました。
15投稿者:使わないのなら、  投稿日:2001/11/16(金)07:24:01
そもそも()はイラナイような気も…。
$aaa =~ m|<b>(.+?)</b>.*?<!-- TEST:(.*?) -->|;
16投稿者:三河人  投稿日:2001/11/16(金)12:27:19
…あ"。
そーゆー定義もアリでしたか…。
17投稿者:三河人  投稿日:2003/11/19(水)12:12:08
うーん、やばい。
全然解りません。どなたか教えて下さい。
http://www.mikawaban.com/r.cgi?main/031115011819/5
の中にあります以下のURL
http://d.hatena.ne.jp/keyword/%B9%E2%B1%DF%BB%FB
をクリックすると、URLが上手く取得されません。
(漢字だから?)

この「/keyword/」以降をデコードすればいいのかな?と思いやってみたのですが
結果は変わりませんでした。
jcode.plの変換は行っていないのですが、それが原因でしょうか?
18投稿者:三河人  投稿日:2003/11/20(木)01:31:50
うーむ、解らない。
飲尿17の件をjcode.plで処理してもダメだった。
1クッション入れなければ出来てるのになんでだろ…?
19投稿者:英太郎  投稿日:2003/11/30(日)02:23:33
出力時にまとめてURLエンコードしといたらだめ?

取得時にデコードしてとばすと。
多分%**が勝手にデコードされるのかとおもわれ。
20投稿者:英太郎  投稿日:2003/12/01(月)02:06:39
だめっぽいなら、全部をBASE64エンコードしておくという手も。。
21投稿者:三河人  投稿日:2003/12/01(月)10:55:30
>英太郎さん
レスありがとうございます。

>出力時にまとめてURLエンコードしといたらだめ?
>取得時にデコードしてとばすと。
>多分%**が勝手にデコードされるのかとおもわれ。
ん?これはどういう意味ですかね?
今現在のソースは↓こんな感じですが
http://dsp
のコメント化してる部分を有効としてもダメだったのです。
取得してからすぐにデコードしてるつもりなんですが。
これとは違う意味でしょうか?

>だめっぽいなら、全部をBASE64エンコードしておくという手も。。
すいません、この意味も解りませんでした。
出張から帰ってきたら調べてみます。
22投稿者:英太郎  投稿日:2003/12/01(月)13:23:38
HTMLを吐き出すときに、URL全体をBASE64でエンコードしておいて、
取得時にデコードするってことなんですが。

ブラウザがPOST/GETするQUERY_STRINGって、勝手にエンコード/デコードされたりするんで。。そのまま出力されてると危険ですよってか、動かない場合多いですね。日本語自体の取り扱いも微妙ですし。
で、本題。

出力時:
print "<a href='〜〜/b.cgi/" . encode_base64($URL) . "'>$URL</a>";

取得が、
$URL = decode_base64($ENV{'QUERY_STRING'});

みたいな感じですかね。

BASE64かURLエンコードどちらかで回避できるかとおもいますよ^^
※私は大抵URLエンコードです。

で、BASE64は、
use MIME::Base64;
エンコード
$a = encode_base64($a);
デコード
$a = decode_base64($a);

みたいな感じです。

参考:どこにでもありそうなスクリプト(笑)
;# --------------------------------------------------------------------
;# URL encode
sub url_encode
{
my ($string) = @_;
$string =~ s/(\W)/sprintf("%%%02X",unpack("C", HTMLを吐き出すときに、URL全体をBASE64でエンコードしておいて、
取得時にデコードするってことなんですが。

ブラウザがPOST/GETするQUERY_STRINGって、勝手にエンコード/デコードされたりするんで。。そのまま出力されてると危険ですよってか、動かない場合多いですね。日本語自体の取り扱いも微妙ですし。
で、本題。

出力時:
print "<a href='〜〜/b.cgi/" . encode_base64($URL) . "'>$URL</a>";

取得が、
$URL = decode_base64($ENV{'QUERY_STRING'});

みたいな感じですかね。

BASE64かURLエンコードどちらかで回避できるかとおもいますよ^^
※私は大抵URLエンコードです。

で、BASE64は、
use MIME::Base64;
エンコード
$a = encode_base64($a);
デコード
$a = decode_base64($a);

みたいな感じです。

参考:どこにでもありそうなスクリプト(笑)
;# --------------------------------------------------------------------
;# URL encode
sub url_encode
{
my ($string) = @_;
$string =~ s/(\W)/sprintf("%%%02X",unpack("C", $1))/eg;
return $string;
}
;# --------------------------------------------------------------------
;# URL decode
sub url_decode
{
my ($string) = @_;
$string=~s/%([0-9a-f][0-9a-f])/pack("C",hex($1))/egi;
return $string;
}))/eg;
return $string;
}
;# --------------------------------------------------------------------
;# URL decode
sub url_decode
{
my ($string) = @_;
$string=~s/%([0-9a-f][0-9a-f])/pack("C",hex(HTMLを吐き出すときに、URL全体をBASE64でエンコードしておいて、
取得時にデコードするってことなんですが。

ブラウザがPOST/GETするQUERY_STRINGって、勝手にエンコード/デコードされたりするんで。。そのまま出力されてると危険ですよってか、動かない場合多いですね。日本語自体の取り扱いも微妙ですし。
で、本題。

出力時:
print "<a href='〜〜/b.cgi/" . encode_base64($URL) . "'>$URL</a>";

取得が、
$URL = decode_base64($ENV{'QUERY_STRING'});

みたいな感じですかね。

BASE64かURLエンコードどちらかで回避できるかとおもいますよ^^
※私は大抵URLエンコードです。

で、BASE64は、
use MIME::Base64;
エンコード
$a = encode_base64($a);
デコード
$a = decode_base64($a);

みたいな感じです。

参考:どこにでもありそうなスクリプト(笑)
;# --------------------------------------------------------------------
;# URL encode
sub url_encode
{
my ($string) = @_;
$string =~ s/(\W)/sprintf("%%%02X",unpack("C", $1))/eg;
return $string;
}
;# --------------------------------------------------------------------
;# URL decode
sub url_decode
{
my ($string) = @_;
$string=~s/%([0-9a-f][0-9a-f])/pack("C",hex($1))/egi;
return $string;
}))/egi;
return $string;
}
23投稿者:三河人  投稿日:2003/12/05(金)00:49:46
>英太郎さん
丁寧にサンプルまで書いていただき、ありがとうございました。
詳しい方って、ほんとーに一杯いるんだなあとつくづく思います。

が…。
ちょっとあれこれと試してみたのですが、どうも上手くいかない。
なんか、b.cgi内でエンコードすると、URL全体がエンコードされて(?)
化け化け状態になってしまいます。
amezo.cgi内でURL出力する時にエンコードが必要なのか?
と思い試してみましたがこちらも上手く行かないっす。

ちょっと時間を置いてまた試してみます。
24投稿者:三河人  投稿日:2003/12/05(金)00:51:53
あ、だめだ。エンコードとデコードがごちゃごちゃになってる(笑)
出張明けの寝不足状態も拍車をかけてるから、やっぱり時間を置きます。
25投稿者:英太郎  投稿日:2003/12/06(土)02:31:07
amezo.cgiでエンコードして出力、b.cgiでデコードですねぇ。多分^^
26投稿者:英太郎  投稿日:2003/12/06(土)02:32:11
丸ごといただければ直さないこともないのだが。。

時間さえいただければv
27投稿者:三河人  投稿日:2003/12/06(土)09:24:00
>英太郎さん
レスありがとうございます。
>amezo.cgiでエンコードして出力、b.cgiでデコードですねぇ。多分^^
この点でもう一度試してみます。

一応、ここでスクリプト一式を公開していますので
http://www.mikawaban.com/sc/
もし余力があるようでしたらご指摘下さい。
28投稿者:三河人  投稿日:2004/03/16(火)03:06:18
うーむ、ダメなのかな?
環境変数の「PATH_INFO」で取得するパス内に「#」があるとそこで切れてしまう。
少し調べたのですが、どこにもその辺りの対処方法が書いてないし。
壷臭いけど、ime.nuへ#付きでパス渡してもあっぱりダメなのを見ると
あかんたれなんかな?
29投稿者:英太郎  投稿日:2004/03/26(金)20:08:26
すまん、忙しくてその後みてなかった。

ちなみに#以降はCGIに渡せないね。
?以降をBASE64URLエンコードかけて、URLエンコードかける。
んで、取得時にURLデコード、BASE64デコードしてみてはどうだろうか?

URLエンコードはしなくても良いかも。
30投稿者:三河人  投稿日:2004/03/26(金)22:26:40
>29の英太郎さん
>すまん、忙しくてその後みてなかった。
>
>ちなみに#以降はCGIに渡せないね。
レスありがとうございます。
やっぱりダメなんですね。

>?以降をBASE64URLエンコードかけて、URLエンコードかける。
>んで、取得時にURLデコード、BASE64デコードしてみてはどうだろうか?
>URLエンコードはしなくても良いかも。
なるほど、PATH_INFOでの取得にはしないって事ですね。
確かにPATH_INFOにこだわる必要性はありませんし。
ありがとうございました。
投稿者 メール