groupmatchstrが初期化される
strreplace コマンドは内部で正規表現を使用しているため groupmatchstr システム変数をクリアしています。
その動作はいまのところ仕様なので、必要ならユーザ変数に代入して保持してください。
maya への返信
strreplace コマンドは内部で正規表現を使用しているため groupmatchstr システム変数をクリアしています。 その動作はいまのところ仕様なので、必要ならユーザ変数に代入して保持してください。
ご回答ありがとうございます。仕様動作であることは理解いたしました。
もう少し詳細を教えていただきたいのですが、strreplaceコマンド内部で正規表現を
使用していることがなぜgroupmatchstrの初期化につながるのでしょうか?
おおざっぱに Perl の感覚で言うと、正規表現でマッチしたら $1 には新しい結果が代入され、その前に $1 に入っていた内容は参照できないのと同じ、という感覚です。
以下補足
strreplace コマンドは strmatch コマンドと同じ内部関数を使用しています。なので、そんなの strmatch コマンドの都合じゃないか、と感じられる実装になっているとは思います。いまのまま実装を変更しないなら、ドキュメントに「groupmatchstrはクリアさます」との注意書きを追加します。
マクロ言語には、明示的に指定された変数に結果を返すのではなく、暗黙的にシステム変数に結果を返すコマンドが複数あります。そのシステム変数の内容がどのコマンドを実行されるまで生き延びるかというドキュメントは整備されておらず、開発者としてもソースコードを見るしかないのが現状です。
maya への返信
おおざっぱに Perl の感覚で言うと、正規表現でマッチしたら $1 には新しい結果が代入され、その前に $1 に入っていた内容は参照できないのと同じ、という感覚です。 以下補足 strreplace コマンドは strmatch コマンドと同じ内部関数を使用しています。なので、そんなの strmatch コマンドの都合じゃないか、と感じられる実装になっているとは思います。いまのまま実装を変更しないなら、ドキュメントに「groupmatchstrはクリアさます」との注意書きを追加します。 マクロ言語には、明示的に指定された変数に結果を返すのではなく、暗黙的にシステム変数に結果を返すコマンドが複数あります。そのシステム変数の内容がどのコマンドを実行されるまで生き延びるかというドキュメントは整備されておらず、開発者としてもソースコードを見るしかないのが現状です。
ご回答ありがとうございました。
お手数ですが、ドキュメントに追加の件はよろしくお願い致します。
問題は解決いたしましたので、本件のクローズよろしくお願いします。
r5769 にてドキュメントを修正しました。
Tera Term Version 4.82 Windows 7orXP で使用しています。
strsplitでgroupmatchstrに分けた後に、strreplaceにて文字列を変換すると
groupmatchstrの中身が初期化されてしまいます。
test1 = 'a,b,c'
strsplit test1 ','
sss2 = 'YYYY.tgz'
strreplace sss2 1 '.tgz' '.gz'
messagebox groupmatchstr1 'test'
messagebox groupmatchstr2 'test'
messagebox groupmatchstr3 'test'
messagebox sss2 'test'