人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: atugari
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Perl STR エラー 変数 正規表現
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● ootatmt
●30ポイント

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

my $chg_str = 'もじ';

my $a = '文字';

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

print $str;

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

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

◎質問者からの返答

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

sub test{

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

$aaa = 'もじ';

$bbb = 'もじ';

#正常パターン

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

#異常パターン

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

}

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

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


2 ● kn1967
●20ポイント

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

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

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

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

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

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

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

◎質問者からの返答

問題が解決致しました。

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

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


3 ● b-wind
●20ポイント

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


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

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

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


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

◎質問者からの返答

問題が解決致しました。

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

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


4 ● ootatmt
●50ポイント

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


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;

◎質問者からの返答

問題が解決致しました。

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

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

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


5 ● まきのっぴ
●30ポイント

例のようなコードを実行してもエラーを再現することができないのですが、$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 における日本語コード変換のメモ等を参考にしてください。

◎質問者からの返答

問題が解決致しました。

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ