Perl echo将\x09替换为\x20

Perl echo将\x09替换为\x20,perl,Perl,一位同事注意到,当创建具有特定不可打印字符的文件时,perl会替换它们。在这种情况下,\x09被替换为\x20 echo `perl -e 'print "\x41"x40 . "\xc4\x09\x40"'` > test.out 查看结果文件时: xxd test.out 你看, 0000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA 0000010: 4141 4141 4141 4141 4141 4

一位同事注意到,当创建具有特定不可打印字符的文件时,perl会替换它们。在这种情况下,\x09被替换为\x20

echo `perl -e 'print "\x41"x40 . "\xc4\x09\x40"'` > test.out
查看结果文件时:

xxd test.out
你看,

0000000: 4141 4141 4141 4141 4141 4141 4141 4141  AAAAAAAAAAAAAAAA
0000010: 4141 4141 4141 4141 4141 4141 4141 4141  AAAAAAAAAAAAAAAA
0000020: 4141 4141 4141 4141 c420 400a            AAAAAAAA. @.

请注意,最后3个字节是\xc4、\x20、\x40,而不是\xc4、\x09、\x40。没人能向我们解释这件事。获取\x09的唯一方法是使用十六进制编辑器手动编辑test.out文件。有什么想法吗?

这是shell做的,不是Perl。如果引用命令替换,将保留选项卡:

echo "$(perl -e 'print "\x41"x40 . "\xc4\x09\x40"')"  > test.out
但我不知道你为什么要把贝壳扯进来。最好完全不使用
echo
,直接在文件中运行perl。这意味着perl输出必须包含自己的换行符,但可以通过多种方式实现:

perl -e 'print "\x41"x40 . "\xc4\x09\x40\n"' > test.out


这是shell所做的,而不是Perl。如果引用命令替换,将保留选项卡:

echo "$(perl -e 'print "\x41"x40 . "\xc4\x09\x40"')"  > test.out
但我不知道你为什么要把贝壳扯进来。最好完全不使用
echo
,直接在文件中运行perl。这意味着perl输出必须包含自己的换行符,但可以通过多种方式实现:

perl -e 'print "\x41"x40 . "\xc4\x09\x40\n"' > test.out


为什么要在backticks中执行perl。。。?你不知道
print
会打印成标准输出吗?实际上我不知道。再说一遍,我是个差劲的程序员-为什么在backticks中执行perl。。。?你不知道
print
会打印成标准输出吗?实际上我不知道。再说一遍,我是个差劲的程序员-P