perlの正規表現について質問です。


この時は、置換文字に変数を使えます。
$str =~ s/文字/$chg_str/g

今度は、
$a = '文字';
$str =~ s/$a/$chg_str/g

みたいなことをしたいのですが、この処理だと、エラーが出てしまいます。これに変わる処理を教えて下さい。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/01/12 15:20:41
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:ootatmt No.1

回答回数1307ベストアンサー獲得回数65

ポイント30pt

my $str = '文字を置換';

my $chg_str = 'もじ';

my $a = '文字';

$str =~ s/$a/$chg_str/g;

print $str;

このコードで試しましたが、結果は「もじを置換」となりエラーは出ませんよ。

全体のコードはどうなっていますか?

id:atugari

モジュールのサブルーチンとして、

sub test{

my ($class, $list) = @_;

$aaa = 'もじ';

$bbb = 'もじ';

#正常パターン

$$list =~ s/文字/$aaa/g;

#異常パターン

$$list =~ s/$bbb/$aaa/g;

}

異常パターンを実行したら、エラーとなります。

perl初心者で申し訳ないのですが、よろしくお願い致します。

2007/01/12 12:09:34
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント20pt

Q1)仮に $bbb と書いておられるわけだと思いますが本当の変数名のなかにピリオドなどが混じってませんか?

Q2)$bbb に代入している文字の中に演算子はまじってませんか?

Q3)具体的に、どのようなエラーメッセージやエラーコードが出ていますか?

Q4)OSやPerlのバージョンは?

Q5)文字コードはShift-JIS?

プロバイダの環境を利用しておられるならばQ4とQ5はプロバイダ名と契約コースでも構いません。

回答中のコメントは禁止で、一人当たり2回の設定なので、どこまでお手伝いできるかわかりませんが、とりあえず、現状では不明点ばかりのため、そのあたりから埋めていきましょうよ。

id:atugari

問題が解決致しました。

「$$」を使用しない方法に致します。

ありがとうございました。

2007/01/12 15:17:42
id:b-wind No.3

回答回数3344ベストアンサー獲得回数440

ポイント20pt

コメント欄が許可されていないので解答欄にて失礼。


基本的な使い方としては1番の方との通りであってるはず。

$$list =~ s/$bbb/$aaa/g;

そもそも $list には何が入るんですか?


あと、エラーの内容ぐらいは書いてもらったほうが良いかと。

id:atugari

問題が解決致しました。

「$$」を使用しない方法に致します。

ありがとうございました。

2007/01/12 15:17:58
id:ootatmt No.4

回答回数1307ベストアンサー獲得回数65

ポイント50pt

モジュールだったら次のように作ってみてはいかがでしょうか。


MySubstitute.pm

package MySubstitute;

use strict;

use Carp qw(croak);

sub new {

my $class = shift;

my $self = {

str => shift

};

bless $self, $class;

}

sub set {

my $self = shift;

$self->{str} = shift;

return $self;

}

sub s {

my $self = shift;

my $a = shift;

my $b = shift;

$self->{str} =~ s/$a/$b/g;

return $self;

}

sub get {

my $self = shift;

return $self->{str};

}

1;


使い方は次のようになります。

use MySubstitute;

my $str = new MySubstitute;

print $str->set('文字を置換')->s('文字' => 'もじ')->s('置換' => 'ちかん')->get;

id:atugari

問題が解決致しました。

「$$」を使用しない方法に致します。

今回は、使用しませんが、このソースは今後、参考にさせて頂きます。

ありがとうございました。

2007/01/12 15:18:37
id:pmakino No.5

回答回数358ベストアンサー獲得回数30

ポイント30pt

例のようなコードを実行してもエラーを再現することができないのですが、$bbb の部分には本当に 'もじ' を代入してあるのでしょうか?

ひょっとして本当は違う文字列を使っていて、ここではダミーで 'もじ' と記入されているのではないでしょうか?

おそらく、perl スクリプトは EUC-JP で書くで解説されているように、Shift_JIS や JIS で内部的に出てくるコードが正規表現のメタ文字として解釈されてしまい動作異常を起こしているのではないかと思います。

日本語を正規表現に使う場合は、さきほどのリンク先で解説されているように、一旦 EUC-JP に変換して置換をかけてから本来のコードに戻せば良いです。(今なら EUC-JP より UTF-8 の方がより良いでしょう)

例えば、元の文字コードが Shift_JIS だったとした場合、

$str = 'やる気充分';

$from = '充分';

$to = 'じゅうぶん';

$str =~ s/$from/$to/g;

print $str;

というコードを

use Encode;

$str = 'やる気充分';

$from = '充分';

$to = 'じゅうぶん';

$str = decode('Shift_JIS', $str);

$from = decode('Shift_JIS', $from);

$to = decode('Shift_JIS', $to);

$str =~ s/$from/$to/g;

$str = encode('Shift_JIS', $str);

print $str;

にします。

しかし、何かの処理のたびにいちいち文字コード変換なんかやっていたら七面倒くさくてしょうがないので、Perl コードは UTF-8 で書き use utf8; 宣言、外部から入力された文字列は最初の時点で UTF-8 に変換してしまう方がお奨めです。

文字コード変換については Perl 5.8.x Unicode関連Perl 5.8.x における日本語コード変換のメモ等を参考にしてください。

id:atugari

問題が解決致しました。

「$$」を使用しない方法に致します。

ありがとうございました。

2007/01/12 15:18:53

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません