Perlでマッチした文字列をサブルーチンで変換する

[上に] [前に] [次に]
もぐ [E-Mail] [HomePage] 1999/06/22(火) 00:39:35
とほほさんのラウンジのプログラムを参考にさせてもらったのですが、
=~ でマッチさせた文字列をサブルーチンを通して変数に代入するというのがうまくいきません。
/eg;などを付けて色々変えてみたのですが、どうしてもうまくできません。
ここに現在のプログラムを載せます。
$i =~ s/(sp:[a-zA-Z0-9\.\/\-+#_?~&%=^\@:;]+)/$i="<A HREF=\"&exurl($1)\" target=\"_newframe\">&exurl($1)<\/A>";/eg;
sp:〜〜〜 の文字をサブルーチンexurlを通して<A href="○○">○○</A>として、$iに代入したいのです。

是非教えて下さい。お願いします。

ふじ 1999/06/22(火) 01:19:37
$i =~ s/(sp:[a-zA-Z0-9\.\/\-+#_?~&%=^\@:;]+)/$i = '<A HREF="'. &exurl($1). '" target="_newframe">'. &exurl($1). '<\/A>';/eg;
こんな感じかな?

何で最初の例で駄目か、っていうと例えば、

print "abc&exurl('hoge')xyz";

ってやっても &exurlはサブルーチンとして解釈されないですよね。
そういう理由。

もぐ [E-Mail] [HomePage] 1999/06/24(木) 21:49:55
ふじさん、レスありがとうございます。
言われたとおりにやってみたのですが、やはりうまくいかないのです。
少し、変えてみて
$i =~ s/(sp:[a-zA-Z0-9\.\/\-+#_?~&%=^\@:;]+)/$i=&exurl($1);/eg;
としたらうまくいったのですが...

それから、気づいたのですが、この目的は、
sp:で始まる文字列(自分のサイトから見た相対パス)をhttp:で始まる絶対パスの文字列に変換する事なのですが、
これだと、置換ではなく、$iにそのアドレス(http:〜〜)だけが入ってしまうではないですか。
うまく、置換させる方法はないでしょうか?

参考:http://www02.so-net.ne.jp/~intro/system/tools/spbbs_2.html(テスト中なのでいくらでも書き込みして下さい)
ソース:http://www02.so-net.ne.jp/~intro/system/tools/spbbs_2.txt

いろいろあって、申し訳ありません。よろしくお願いします。

もぐ [E-Mail] [HomePage] 1999/06/24(木) 21:51:47
追加しておきます。
上のソースで例のプログラムの部分($i =~ s/(sp:[a-zA-Z0-9\.\/\-+#_?~&%=^\@:;]+)/$i=&exurl($1);/eg;)は
sub als{
にあります。よろしくお願いします。

ふじ 1999/06/24(木) 22:19:44
えーと、「うまくいかない」ってのを具体的に示して貰えないと。
#エラーが出る?望まない形に置換される?

>これだと、置換ではなく、$iにそのアドレス(http:〜〜)だけが入ってしまうではないですか。
そうですね。
ちょっと長くなるけど、
I:while($i){
if($i =~ /(sp:中略)/){
$i = $` . "<A href=". &exurl($1). 中略 .">" .$';
}else{
last I;
}
}
こんな感じで、$i に、
(マッチした部分の前)(変換後)(マッチした部分の後ろ)
を入れてマッチする限り繰り返す、ってのはどうですか?
#もっとスマートな書き方がある気もするけど。

ふじ 1999/06/24(木) 23:11:15
自己フォロー。
#余りに頭の悪そうなコーディングをしてしまった(^^;;;

>I:while($i){
>if($i =~ /(sp:中略)/){
>$i = $` . "<A href=". &exurl($1). 中略 .">" .$';
>}else{
>last I;
>}
>}
これは
while($i =~ /(sp:中略)/){
$i = $` . "<A href=". &exurl($1). 中略 .">" .$';
}
とすべきでした。

が、よく考えてみると、もっと単純に
$i =~ s/(sp:中略)/'<A href="'.&exurl($1). '" target="_newframe">'. &exurl($1). '<\/A>'/eg;
で行けるはずなんですが。

もぐ 1999/06/25(金) 03:33:55
[[解決]]
ありがとうございました。
エラーは空欄として返されてしまうという事だったのですが、
とりあえず、ふじさんの方法で実行してみたらうまくいきました。

ふじさん、ありがとうございました。

[上に] [前に] [次に]