
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.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 では \\ を \ に変換します。
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.1
- 回答日時:
eval を使えば出来そうです。
例)
$hoge = 'hoge\thoge\n';
print eval "\"$hoge\"";
ARGVの値でやると引数次第で任意のコードが実行できてしまうので、間接的に第3者から実行される可能性のあるプログラムなどでは危険ですが・・・。
参考URL:http://itpro.nikkeibp.co.jp/article/Reference/20 …
お探しの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ランキング
-
Perlのプログラムについて
-
Perlのエラーについてご教授く...
-
Perlで一定値以上の場合にデー...
-
このファイルを開く方法で困っ...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
bashスクリプト
-
perlをバージョンアップしたら...
-
perlプログラミング 空白行削除
-
Wallpaper Engineでおすすめの...
-
perlのflock関数でロックをかけ...
-
Strawberry Perl for Windows ...
-
フローチャート 九九
-
perlについての質問
-
ターミナルで特定の文字と文字...
-
LinuxにおいてのPerlのプログラ...
-
P.Cのシングルチューナーとダブ...
-
PerlでUTF-8のファイルの文字列...
-
【超初心者】異なるディレクト...
-
perlで複数のファイルの処理に...
-
Perl 順位の重複
-
Perlで特定文字列から特定文字...
おすすめ情報