2

Perl で文字列変数のすべてのバックスラッシュを保存して出力する方法はありますか? 例えば:

$str = 'a\\b';

出力は

a\b

しかし、私は必要です

a\\b

問題は、バックスラッシュをエスケープするために文字列を処理できないことです。データベースから複雑な正規表現を読み取る必要があり、それらがどの組み合わせと数で表示されるかわからないため、それらを正確に印刷する必要があるためです。ウェブページ。

テンプレート ツールキットと html および html_entity フィルターを試しました。これまでのところ機能する唯一の方法は、一重引用符で囲まれたヒア ドキュメントを使用することです。

print <<'XYZ';
a\\b
XYZ

しかし、変数を補間できないため、このソリューションは役に立たなくなります。

Web ページ、ファイル、およびシェルに文字列を書き込もうとしましたが、運が悪く、常にバックスラッシュが 1 つ消えてしまいます。たぶん私は完全に間違った方向に進んでいるのかもしれませんが、すべての組み合わせと数字にバックスラッシュを含む複雑な正規表現を変更せずに出力する正しい方法は何ですか?

つまり、何百もの正規表現を文字列データとして含むデータベースがあります。それらを perl で読み込んで、データベースにあるのと同じように Web ページに印刷したいと考えています。これらの正規表現は多くの管理者によって常に変更されているため、どのように、何をエスケープすればよいかは事前にわかりません。典型的な例は次のようになります: 'C:\\test\\file \S+' しかし、翌日には次のように変わる可能性が '\S+ C:\\test\\file' あります。おそらく正しい結論は、バックスラッシュがどの組み合わせでどの数字に表示されても、すべてのバックスラッシュを 1 回だけエスケープすることでしょう? これは、それらを2倍にすることが機能することを意味します。そうすれば、問題は私が恐れていたほど大きくはありません。bashでテストしたところ、2つ、さらには3つのバックスラッシュが連続して機能します(4つのバックスラッシュは2つを出力し、6つのバックスラッシュは3つを出力します)。

4

7 に答える 7

2
my $str = 'a\\b';
print $str;

これは印刷されa\\bます。

私の $str = 'a\\\\b'; を使用してください。代わりは

于 2013-04-23T11:59:22.597 に答える
1

次の正規表現を使用して、文字列を正しく形成できます。

my $str = 'a\\b';
$str =~ s/\\/\\\\/g;
print "$str\n";

これは印刷されa\\bます。

編集:

代わりに、非補間ヒアドキュメントを使用できます。

my $str = <<'EOF';
a\\b
EOF
print "$str\n";

これはまだ印刷されa\\bます。

于 2013-04-23T12:23:23.573 に答える
1

これは PITA ですが、バックスラッシュを 2 倍にする必要があります。

 a\\\\b

それ以外の場合は、バックスラッシュを別の変数に格納して補間することができます。

于 2013-04-23T12:00:27.610 に答える
1

私が解決しようとした問題は存在しません。コード内で文字列を直接初期化することと、html フォームを使用することを混同しました。すべてのバックスラッシュを保持するコード内で文字列を使用することは、ヒア ドキュメントを使用するか、文字列を含むテキスト ファイルを読み取ることによってのみ可能です。しかし、Web ページで html フォームを使用して文字列を挿入し、CGI モジュールから escapeHTML() を使用すると、すべてが処理され、最も複雑な特殊文字の組み合わせを挿入できます。それらはすべて、挿入されたとおりに表示および保存されます。したがって、コード内で文字列を直接使用して最初に調べようとするのではなく、html およびデータベース操作から直接開始する必要がありました。とにかく、助けてくれてありがとう。

于 2013-04-24T06:37:45.753 に答える