$xxにある文字列の、最初から特定の文字までを全て消去するには?
[上に]
[前に]
[次に]
y
[E-Mail]
1999/07/25(日) 23:21:37
$xx =~ s///; を使い、ある特定の文字列より前の部分を全て消去
しようとしたのですが、改行が含まれていると、それより前の部分が
削除出来されません。何かいい方法はないでしょうか?
よろしくお願いしますm(__)m
Aurai
1999/07/25(日) 23:38:36
「.」じゃなくて「[\x00-\xFF]」とかを使えばいいんじゃないですか
y
[E-Mail]
1999/07/26(月) 00:02:19
Auraiさん、レスをありがとうございました。
$line =~ s/[\x00-\xFF]*<!-- begin text -->//;
としてみましたが、<!-- begin text -->のある行しか消えてくれませんでした。
書き方が悪いのでしょうか?
ふじ
1999/07/26(月) 00:58:36
$xx =~ s///s;
で出来るはず。
s オプションを付けると . が改行文字にもマッチします。
y
[E-Mail]
1999/07/26(月) 01:39:51
ふじさん、ありがとうございます。
$line =~ s/.*<!-- begin text -->//s;
としてみましたが、エラーが出てしまいました。
Substitution pattern not terminated in file ***.cgi at line
257, next char ^?
syntax error in file ***.cgi at line 257, next 2
tokens "s/.*<!-- begin text -->//s;
"
Execution of ***.cgi aborted due to compilation errors.
どこがおかしいのでしょうか?
B-Cus
1999/07/26(月) 01:43:32
perl4なんて時代遅れのものを使うのはやめましょう。
perl5ならうまくいきます。
特別な事情もないのに、今時perl4を使うことは悪いことです。
管理者に頼んでもperl5を入れてくれないなら、その管理者は無能です。
y
[E-Mail]
1999/07/26(月) 02:09:53
B-Cusさん、ありがとうございました。
perl5でやってみました。早いですね(^^;
早速cgiを全部perl5で動かすようにしました。
ですが、依然として改行から前が消去されません。
$line =~ s/.*<!-- begin text -->//s;
エラーは出なくなったのですが・・・。
他に原因があるのでしょうか?
B-Cus
1999/07/26(月) 02:45:35
できると思うけどなぁ。
$_=<<END;
abcXXXdef
abc<!-- begin text -->def
abcZZZdef
END
$_ =~ s/.*<!-- begin text -->//s;
print $_;
実行結果:
def
abcZZZdef
タイプミスの可能性はないですか?
y
[E-Mail]
1999/07/26(月) 03:01:43
度々ありがとうございます。
タイプミスはないです。出来ません・・・(;_;)
検索の対象はcgiが吐き出したhtml文書なのですが、
改行コードの違い云々という可能性はないですか?
ちなみに、htmlを吐き出しているcgiは
にあさんの作っているうぇぶ会議室です。場所はここです。
http://www2.biglobe.ne.jp/%7Enir/
B-Cus
1999/07/26(月) 03:14:30
> 改行コードの違い云々という可能性
さっきの発言の前に
$data =~ s/\n/\r/g;
$data =~ s/\n/\r\n/g;
などとして試してみましたが、それはないと思います(が、断言はできんなぁ)。
まぁ実際の値と周辺のコードがわからんので、何とも言えませんが、
どうしてもできなかったら
($tmp,@line) = split("<!-- begin text -->",$line);
$line = join("",@line);
でしょうか。
もし s///s がうまくいったら、原因を教えてください。
y
[E-Mail]
1999/07/26(月) 04:17:57
悩ませてしまっているみたいで恐縮ですm(__)m
($tmp,@line) = split("<!-- begin text -->",$line);
$line = join("",@line);
でやってみたところ、今度は全て消えてしまいました(;_;)
秘密のページなので、うっかり「ここです」とは言えないのですが、
スクリプトは、ここにあるwwwsrch.cgi v.3.04で、264行付近を
$line =~ s/.*<!-- begin text -->//s;
$line =~ s/($word)/<font color=red>$1<\/font>/ig;
としています。これをうぇぶ会議室に組み込んで全文検索をさせています。
検索後の、検索された語の前後の表示で、意味のない
<!-- begin text -->より前の部分を全てカットしたいのです。
やたらタグとか出てくるからうるさくて・・・。
とーむ、とんでもない勘違いをやらかしている気が (^^;
B-Cus
1999/07/26(月) 07:26:35
$line が本当に
…
<!-- begin text -->
…
となっているかどうか確認されましたか? 僕もちゃんと確認した
わけじゃないけど、$line って複数行のデータが入ってないんじゃ
ないですか?
> wwwsrch.cgi v.3.04で、264行付近を
> $line =~ s/.*<!-- begin text -->//s;
その うぇぶ会議室とやらは、ファイル構造が
<A HREF="$CGIROOT/article.$CGI?room=$post_room">
${NEWICON}新規記事投稿</A>
<A HREF="$CGIROOT/article.$CGI?room=$post_room&ref=$mes">
${FOLLOWICON}フォロー記事投稿</A>
<A HREF="$CGIROOT/cancel.$CGI?room=$post_room&mes=$mes">
${CANCELICON}記事のキャンセル</A>
<HR>
From: $link
<<A HREF="mailto:$ids{'email'}">$ids{'email'}</A>><BR>
Subject: $ids{'subject'}<BR>
Date: $date<BR>
$reference<PRE>
<!-- begin text -->
$text
<!-- end text -->
となっているように見えるのですが、もしその通りであれば
wwwsrchに $line =~ s/.*<!-- begin text -->//s; を入れても
ダメでしょう。だって、$lineは一行分のデータしか入ってない
のだから。
y
[E-Mail]
1999/07/26(月) 09:58:26
[[解決]]
なるほどー。
$lineには数行分の文字が入っていると頭から思いこんでいたのですが、
行単位での作業を繰り返しているみたいです。
大体、lineって行って意味じゃん>自分(^^;
wwwsrchに手を加えるのは無理だから(僕の能力では)、
うぇぶ会議室の方をいじって改行を落としたら(スマートでないと思いますが)
上手くいきました(^^)
大変勉強になりました。B-Cusさんをはじめ、お答えいただいた方、
ありがとうございました。また何かあったらよろしくお願いしますm(__)m
B-Cus
1999/07/26(月) 10:27:47
言っちゃ悪いけど、がびーんな結論ですな。
・質問する際は、確認できることは自分で確認する
・何が原因なのかを切り分ける(自分で切り分けられないなら、
判断材料となる情報をできるだけ提供する)
・情報は最初から惜しまず書く
できる範囲で、ですけどね。
y
[E-Mail]
1999/07/26(月) 23:18:46
申し訳ないです。特に、情報を惜しまず書く、
というのが欠けていたように思います。
以後なるべく書くようにしますのでお許し下さい。
もうこういうことはしません、と断言できないのが辛いと言うか、
もどかしいのですが・・・。ただ謝るしかありませんm(__)m
その後の経過ですが、$lineを出力する行を制限して、
<!-- begin text -->(19、20行目に出てくる)
より以前を表示させなくしました。目標は達成です。
まあー
1999/07/29(木) 03:07:45
初心者だから
[上に]
[前に]
[次に]