この時は、置換文字に変数を使えます。
$str =~ s/文字/$chg_str/g
今度は、
$a = '文字';
$str =~ s/$a/$chg_str/g
みたいなことをしたいのですが、この処理だと、エラーが出てしまいます。これに変わる処理を教えて下さい。
my $str = '文字を置換';
my $chg_str = 'もじ';
my $a = '文字';
$str =~ s/$a/$chg_str/g;
print $str;
このコードで試しましたが、結果は「もじを置換」となりエラーは出ませんよ。
全体のコードはどうなっていますか?
Q1)仮に $bbb と書いておられるわけだと思いますが本当の変数名のなかにピリオドなどが混じってませんか?
Q2)$bbb に代入している文字の中に演算子はまじってませんか?
Q3)具体的に、どのようなエラーメッセージやエラーコードが出ていますか?
Q4)OSやPerlのバージョンは?
Q5)文字コードはShift-JIS?
プロバイダの環境を利用しておられるならばQ4とQ5はプロバイダ名と契約コースでも構いません。
回答中のコメントは禁止で、一人当たり2回の設定なので、どこまでお手伝いできるかわかりませんが、とりあえず、現状では不明点ばかりのため、そのあたりから埋めていきましょうよ。
問題が解決致しました。
「$$」を使用しない方法に致します。
ありがとうございました。
コメント欄が許可されていないので解答欄にて失礼。
基本的な使い方としては1番の方との通りであってるはず。
$$list =~ s/$bbb/$aaa/g;
そもそも $list には何が入るんですか?
あと、エラーの内容ぐらいは書いてもらったほうが良いかと。
問題が解決致しました。
「$$」を使用しない方法に致します。
ありがとうございました。
モジュールだったら次のように作ってみてはいかがでしょうか。
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;
問題が解決致しました。
「$$」を使用しない方法に致します。
今回は、使用しませんが、このソースは今後、参考にさせて頂きます。
ありがとうございました。
例のようなコードを実行してもエラーを再現することができないのですが、$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 における日本語コード変換のメモ等を参考にしてください。
問題が解決致しました。
「$$」を使用しない方法に致します。
ありがとうございました。
モジュールのサブルーチンとして、
sub test{
my ($class, $list) = @_;
$aaa = 'もじ';
$bbb = 'もじ';
#正常パターン
$$list =~ s/文字/$aaa/g;
#異常パターン
$$list =~ s/$bbb/$aaa/g;
}
異常パターンを実行したら、エラーとなります。
perl初心者で申し訳ないのですが、よろしくお願い致します。