Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには
どのようにしたらよいでしょうか。
つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に
するという事です。
ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、
既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。
下記は簡単な例でやろうとしてる事を示したものです。
add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを
タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。
$ cat unescape.pl
#!/bin/perl
$add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される
#$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される
#$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される
$tgt = 'abc';
print "add: " . $add , "\n";
print "before: " . $tgt . "\n";
$tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない
print "after: " . $tgt . "\n";
$ perl unescape.pl
add: \tdef
before: abc
after: abc\tdef
No.1
- 回答日時:
eval を使えば出来そうです。
例)
$hoge = 'hoge\thoge\n';
print eval "\"$hoge\"";
ARGVの値でやると引数次第で任意のコードが実行できてしまうので、間接的に第3者から実行される可能性のあるプログラムなどでは危険ですが・・・。
参考URL:http://itpro.nikkeibp.co.jp/article/Reference/20 …
No.2
- 回答日時:
脆弱性を考えなくて良い状況なら、eval を使えば簡単です。
$a = 'a\tb\n';
print $a , "\n";
$b = eval("\"$a\"");
print $b , "\n";
$a の値が信頼できない場合は、
$b = $a;
$b =~ s/\\t/\t/g;
$b =~ s/\\n/\n/g;
・・・・・
print $b , "\n";
のように必要なだけ置換するくらいでしょうか。
No.3ベストアンサー
- 回答日時:
2文字限定でよければ、正規表現の置換を使って変換することができると思います。
my $foo = $ARGV[0];
$foo =~ s/\\./qq("$&")/eeg;
print "$foo\n";
$ perl unescape.pl 'abc\tdef\\ghi'
abc def\ghi
シングルクォート内での \\ の扱いは、Bash と Perl では異なります。Bash では \\ のままですが、Perl では \\ を \ に変換します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux bashでシングルクォート内の変数の組み込み方教えてください。 2 2023/02/14 19:30
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- 数学 高一数学 数と式 画像あり (2)までは出来たのですが、 (3)の下線部の文字式の展開が理解できませ 2 2023/08/19 15:48
- その他(学校・勉強) a/(a+b)の展開について。 1 2022/12/26 18:22
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 10:07
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
多元配列の0初期化
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
10Mバイトて文字数に すると何...
-
Excel VBA メール作成について ...
-
ビットスワップとバイトスワッ...
-
POSTで配列のデータを渡す方法は?
-
pythonでDBのカラム名で取得し...
-
number 改行が追加できない
-
UTF-8で5~6バイトになる文字コ...
-
Rstudioによるテキストマイニン...
-
char str[256]の256の意味は?
-
C言語 構造体の名前欄?を小文...
-
if文中で@***(配列変数)って...
-
JavaScriptからCGI
-
クロス集計
-
CGI(Perl)の文字化けについて
-
バイト列とバイナリ列の違いが...
-
CGIで改行タグを改行コードに変...
-
GETメソッドとPOSTメソ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonにCでのexternはありますか
-
python 3.10で 同じlistに同じ...
-
CSVから構造体へ代入
-
VBScriptでカレントディレクト...
-
マクロの書き換え箇所がわかり...
-
Perlで変数中のエスケープされ...
-
UWSCにおける変数の扱い方
-
VB2010での連立方程式の計算
-
なぜかわかりませんscanf()の戻...
-
c言語 グローバル変数
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
stable diffusionのエラー
-
COBOLのCOMP形式について
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
おすすめ情報