2012-02-26 5 views
0

"\n"の余分なエスケープを使わずにこれを実行すると、hexdumpは埋め込み改行の0aを表示しません。 "\n"にはなぜ追加治療が必要なのですか? (私はエスケープを行うString::ShellQuoteを見つけた答えを探しながら。)PerlからBashへ:改行文字エスケープ「 n」はどのように特別な動作をしますか?

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use utf8; 
binmode STDOUT, ':utf8'; 
use charnames qw(:full); 
use IPC::System::Simple qw(system); 

for my $i (0x08 .. 0x0d) { 
    printf "0x%02x - %s\n", $i, '\N{' . charnames::viacode($i) . '}'; 
    my $string = "It" . chr($i) . "s"; 
    $string =~ s/\n/\\n/g; 
    system("echo -e \Q$string\E | hexdump -C"); 
    say ""; 
} 
+1

Quotemetaはperl内の文字列をエスケープします。 'echo'コマンドは正しく出力された' \ n'を受け取り、正しくbashの改行文字として解釈します。 'stdout'は、シェルエスケープされていない限り、改行文字を受け取らないhexdumpに行送ります。 –

答えて

3

を使用すると、2つの文字\nに改行を変換しない場合は、このコマンドを実行している

echo -e \ 
| hexdump -C 

shに、それはです

echo -e | hexdump -C 

に相当する

あなたは2つの文字\nに改行を変換すると、あなたはそれが-eの下に改行を出力するための2つの文字echoから\nを、渡すコマンド

echo -e \\n | hexdump -C 

を実行しています。


あなたが-eを利用すると-eのためのエスケープを作成する必要はありません。適切なシェルコマンドを作成することができます。そのコマンドは次のようになります。

echo ' 
' | hexdump -C 

これはさまざまな方法で実行できます。あなた自身のソリューションを展開することができます。

(my $sh_literal = $string) =~ s/'/'\\''/g; 
$sh_literal = "'$sh_literal'"; 
system("echo $sh_literal | hexdump -C"); 

String::ShellQuoteがあります。

use String::ShellQuote qw(shell_quote); 
my $sh_literal = shell_quote($string); 
system("echo $sh_literal | hexdump -C"); 

最後に、シェルを完全に避けることができます。

open(my $fh, "|-", "hexdump", "-vC") 
    or die("Could not start hexdump: $!\n"); 
print($fh $string); 
1

@mugenkenichiは、エコーはあなたが二回の特殊文字をエスケープする必要がありますのでperlのために一度、あまりにもあなたの文字列を解釈し、一度エコーのためにされ、コメントとして。

代わりに、このアプローチは、より便利なことがあります

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use utf8; 
binmode STDOUT, ':utf8'; 
use charnames qw(:full); 
use IPC::System::Simple qw(system); 

for my $i (0x08 .. 0x0d) { 
    printf "0x%02x - %s\n", $i, '\N{' . charnames::viacode($i) . '}'; 
    my $string = "It" . chr($i) . "s"; 
    open(my $fh, "| hexdump -vC") 
     or die "could not talk to hexdump"; 
    print $fh $string; 
    say ""; 
} 
関連する問題