Perlについての質問箱 34箱目 at TECH
[2ch|▼Menu]
597:デフォルトの名無しさん
08/03/03 16:28:09
Wiki文法でのテキスト整形で悩んでいます。

改行含めた長い文章が $i に入ってます。
文章中のリンクアンカーに相当する部分はWikipediaなどでお馴染みの
[[テキスト]]
という感じで書かれています。

これを
$i =~ s/\[\[(.+?)\]\]/<a href="$1">$1<\/a>/g;
で変換しているのですが、できれば <a href="$1"> の中のほうの$1をURLエンコードして収めたいのです。

URLエンコードのサブスクリプトはこんな感じです。

sub url_enc {
local($_) = @_;
s/(\W)/'%' . unpack('H2', $1)/eg;
s/\s/+/g;
$_;
}

よろしくお願いします。


598:デフォルトの名無しさん
08/03/03 16:49:12
すみません、補足です。
CGIにはインフォパスか引数で渡します。

<a href="hoge.cgi?$1">

こんな感じで。

599:デフォルトの名無しさん
08/03/03 17:31:00
サブルーチンに置換部分をまとめて、
$i =~ s/\[\[(.+?)\]\]/&url_enc($1)/eg;

600:デフォルトの名無しさん
08/03/03 17:58:47
そっか!e修飾子を利用した時は置換部分は関数以外は入れたらダメなんですね。

$i =~ s/\[\[(.+?)\]\]/<a href="&url_enc($1)">$1<\/a>/eg;

だとエラーが出るんで何でだろうとずっと思ってたんです。
ありがとうございます。勉強になりました。

601:デフォルトの名無しさん
08/03/03 18:25:15
>>600
自分で '%' . unpack('H2', $1) なんてのを入れてるじゃん。

sub html_escape {
  my $str = $_[0];
  $str =~ s/&(?!(?:\w+|#(?:[Xx][0-9A-Fa-f]+|[0-9]+));)/&/g;
  $str =~ s/([\x00-\x09\x0B\x0C\x0E-\x1F"'<>\x7F])/&#${ \ ord $1 };/g;
  $str;
}
sub uri_escape {
  my $str = $_[0];
  $str =~ s/%(?![0-9A-Fa-f][0-9A-Fa-f])/%25/g;
  $str =~ s/([\x00-\x20"'<>\\^`{|}\x7F-\xFF])/ sprintf '%%%02X', ord $1 /eg;
  $str;
}
$i =~ s{ \[\[ (.+?) \]\] } {
  my($url, $face) = ($1, $1);
  $url = uri_escape($url);
  $face = html_escape($face);
  qq|<a href="$url">$face</a>|;
}egx;

602:デフォルトの名無しさん
08/03/03 18:40:50
>>601

すみません、
実はurl_encは誰かから教えてもらったもので丸写しなんです ^_^
でも今回のことでやっともろもろ判りました。

コード、参考になります(というかありがたくいただきます)。
ありがとうございます。

603:デフォルトの名無しさん
08/03/05 05:49:41
JavaのプログラムからCGIを実行しようとしたのですが、302エラーが返されます。
何故なんでしょうか?

604:デフォルトの名無しさん
08/03/05 10:21:39
>>603
302 はエラーじゃないし Perl の話でもない。
URLリンク(www.studyinghttp.net)

CGI: Common Gateway Interface part 13
スレリンク(php板)

605:デフォルトの名無しさん
08/03/05 10:22:39
Moved Temporarily

606:デフォルトの名無しさん
08/03/05 13:38:15
>>604-605
パーミッションの設定をしたら動きました;;
お騒がせしました

607:デフォルトの名無しさん
08/03/05 15:23:38
perlのuntil文っていらないと思うんですけど、皆さんどんなときに使ってますか?

608:デフォルトの名無しさん
08/03/05 16:30:42
使わなきゃいいじゃん

609:デフォルトの名無しさん
08/03/05 17:00:16
while (! hoge)よりも直感的に書ける場合もある気がする
とくに後置したときに英文っぽくておさまりがいいような

610:デフォルトの名無しさん
08/03/05 17:23:51
while ( !( ... || ... && ... || ...) )
とかになったらさすがに使うw

611:デフォルトの名無しさん
08/03/05 17:26:43
あー、あと成功したら0エラーならエラーの種類が1以上って関数が
成功したらとにかく実行って時とかに == 0 とかやらなくて済むとか。

612:デフォルトの名無しさん
08/03/05 18:07:48
>>609->>611
なるほど。参考になりました。
untilも使い道はいろいろあるんですね。

613:デフォルトの名無しさん
08/03/05 18:32:27
意味的に「〜になるまで続ける」って感じの時も until のがわかりやすいかも

614:デフォルトの名無しさん
08/03/05 18:37:39
>>613
確かに。これは考えたことなかったな。

615:デフォルトの名無しさん
08/03/06 02:27:57
XSでCライブラリを使ったモジュールを作ったが、
それが$HOME/local/libのライブラリを使っていて
CGIにLD_LIBRARY_PATHが設定できないのでモジュールで使っている.soが読めない。
$ENVとuse Envでやったが、無視されるみたいだし
共有サーバでhttpdがsuExecで動いているので.htaccessでSetEnvすることもできない。
DynaLoaderがロードする.soがリンクしているsoのパスを指定できる方法ある?


616:デフォルトの名無しさん
08/03/06 12:16:11
>>615
ldの-Rオプションでバイナリに埋め込むのはどう?

617:デフォルトの名無しさん
08/03/06 19:32:32
>>615
前スレの570〜580あたりで書き込みした者ですが、

DynaLoader.pmがLoadするだけならば、
use DynaLoader;
@DynaLoader::dl_library_path に、対象のPATHを放り込んでやればLoad出来ます。

その{perl_module}.soがよその(/use/lib,/lib以外の)ライブラリをロードするようにコンパイルされていたら、
多分 use した時点でエラーになります。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4913日前に更新/153 KB
担当:undef