Perlの正規表現について

asap [E-Mail] 2000/03/29(水) 10:06:54
こんにちは
初心者なもので、Perlの正規表現について質問させてください。
$contentsという変数の中に

名前=AAA
生年月日=
住所=BBB

というデータがあった場合、=の後にデータのない行を削除するには、

$contents=~ s/^\.\+=\n//g;

では間違いでしょうか。

初歩的な質問ですみませんが、よろしくお願いします。
javaka 2000/03/29(水) 10:34:35
$contents=~ s/.*=\n//g; でしょう。

文字列でない「.」とか「+」はエスケープしちゃだめでしょう。
Syn [E-Mail] 2000/03/29(水) 10:41:58
削除とゆうか、空行になってしまうのではないかと思いました。

$contents=~ s/^.+=\n//g;

よりは

$contents=~ s/^[^=]+=$//g;

のほうがいいような気が。
S-pore [HomePage] 2000/03/29(水) 10:52:58
> $contentsという変数の中に
> 名前=AAA
> 生年月日=
> 住所=BBB
> というデータがあった場合

というのが,
$contents = "名前=AAA\n生年月日=\n住所=BBB\n";
という意味なのなら,デフォルトで「^」ではまずいような気がします。
(文字列の先頭にしかマッチしなかったはずなので)

$contents =~ s/^.+\=\n//mg;

元のを生かすならこんな感じだと思います。
でも javaka さんのやり方のほうがスマートでいいですね。
Syn [E-Mail] 2000/03/29(水) 10:59:01
あ、そうか。 @contents じゃないのですね。
上のわたしのは無視してください。 すみません。
asap [E-Mail] 2000/03/29(水) 11:12:07
[[解決]]
javaka さんの方法で解決しました。助かりました。
Syn さん、S-pore さん、ありがとうございました。

+とか*とかの文字はどういう場合にエスケープしないと
いけないのかなど、もっと勉強しないといけないですね。
asap [E-Mail] 2000/03/29(水) 11:12:21
[[解決]]
javaka さんの方法で解決しました。助かりました。
Syn さん、S-pore さん、ありがとうございました。

+とか*とかの文字はどういう場合にエスケープしないと
いけないのかなど、もっと勉強しないといけないですね。
2000/03/29(水) 11:26:51
>$contents=~ s/.*=\n//g; でしょう。
gは必要なのでしょうか?
javaka 2000/03/29(水) 13:49:26
>gは必要なのでしょうか?
今回は必要ないです。
なんたってデータが3つでマッチが一つですから...。

しかし、普通は多数のケースがほとんどですので、gをつけたほうがいいです。
つけれは、全行対象で、つけなければ、はじめの一つのみ対象です。
yoru 2000/03/29(水) 14:06:06
>+とか*とかの文字はどういう場合にエスケープしないと
>いけないのかなど、もっと勉強しないといけないですね。
<B>文字</B>として使用したい場合はエスケープするべき、
<B>メタ文字</B>として使用したい場合はエスケープしてはいけない。
追加発言 2000/03/29(水) 14:08:30
>今回は必要ないです。
>なんたってデータが3つでマッチが一つですから...。
いんや~
多分ループでデータが1行ずつ入ってくる処理なんだと思うぞ。
なりきり 2000/03/29(水) 18:08:30
スクリプトをたぶんforeachで処理してるんでしょうけど、データ=値という形であればhashを利用したほうが無難だと思いますよ。なんせ、処理が早くなるし、データのメンテナンスもしやすくなるしぜひおためしあれ。