$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
 &lt;<A HREF="mailto:$ids{'email'}">$ids{'email'}</A>&gt;<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
初心者だから

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