perl -00 switch是什么意思? (八进制或十六进制参数)

时间:2018-03-29 21:03:50

标签: perl text-processing text-parsing

例如,我知道

perl -l00e 

相当于

$/ = "\n"; $\ = "\000"; 

它同时设置$INPUT& $OUTPUT_RECORD_SEPARATOR


这个开关的其他“技巧”是什么?

1 个答案:

答案 0 :(得分:1)

好的,对于perl -l00e\OOOnull byte,来自man ascii

     Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
     ────────────────────────────────────────────────────────────────────────
     000   0     00    NUL '\0' (null character)   100   64    40    @


因此,-l00e将输出分隔符设置为NULL byte,对于逐个管道传递到xargs -0非常有用


进一步研究其他一些'技巧' :


perldoc perlrun

  

-0 [八进制/十六进制]   将输入记录分隔符($ /)指定为八进制或十六进制数。如果没有数字,则空字符是分隔符。其他开关可以在数字之前或之后。例如,如果您有一个可以打印由空字符终止的文件名的find版本,您可以这样说:

find . -name '*.orig' -print0 | perl -n0e unlink
  

特殊值00将导致Perl在段落模式下粘贴文件。任何值0400或更高将导致Perl整个文件,但按照惯例,值0777是通常用于此目的的。

     

您还可以使用十六进制表示法指定分隔符:-0xHHH ...,其中H是有效的十六进制数字。与八进制表单不同,此表单可用于指定任何Unicode字符,甚至超过0xFF的字符。因此,如果您确实需要0777的记录分隔符,请将其指定为-0x1FF。 (这意味着您不能将-x选项与包含十六进制数字的目录名一起使用,否则Perl会认为您已将十六进制数指定为-0。)


对我知道的所有组合进行测试很有意思:


for i in -l00e -n00e -p00e -n0e -l0e -0ne -0le -p0e -00le -00ne -00pe -0777ne -0777pe -0777le -l0777pe -l0777ne; do
    echo "perl $i"
    perl -MO=Deparse "$i" | head -1 | sed 's|$/|$/ $INPUT_RECORD_SEPARATOR|;s|$\\|$\\ $OUTPUT_RECORD_SEPARATOR|'
done


perl -l00e
$/ $INPUT_RECORD_SEPARATOR = "\n"; $\ $OUTPUT_RECORD_SEPARATOR = "\000"
perl -n00e
$/ $INPUT_RECORD_SEPARATOR = ""; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -p00e
$/ $INPUT_RECORD_SEPARATOR = ""; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -n0e
$/ $INPUT_RECORD_SEPARATOR = "\000"; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -l0e
$/ $INPUT_RECORD_SEPARATOR = "\n"; $\ $OUTPUT_RECORD_SEPARATOR = "\000"
perl -0ne
$/ $INPUT_RECORD_SEPARATOR = "\000"; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -0le
$/ $INPUT_RECORD_SEPARATOR = "\000"; $\ $OUTPUT_RECORD_SEPARATOR = "\000"
perl -p0e
$/ $INPUT_RECORD_SEPARATOR = "\000"; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -00le
$/ $INPUT_RECORD_SEPARATOR = ""; $\ $OUTPUT_RECORD_SEPARATOR = "\n\n"
perl -00ne
$/ $INPUT_RECORD_SEPARATOR = ""; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -00pe
$/ $INPUT_RECORD_SEPARATOR = ""; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -0777ne
$/ $INPUT_RECORD_SEPARATOR = undef; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -0777pe
$/ $INPUT_RECORD_SEPARATOR = undef; $\ $OUTPUT_RECORD_SEPARATOR = undef
perl -0777le
$/ $INPUT_RECORD_SEPARATOR = undef; $\ $OUTPUT_RECORD_SEPARATOR = ""
perl -l0777pe
$/ $INPUT_RECORD_SEPARATOR = "\n"; $\ $OUTPUT_RECORD_SEPARATOR = "\377"
perl -l0777ne
$/ $INPUT_RECORD_SEPARATOR = "\n"; $\ $OUTPUT_RECORD_SEPARATOR = "\377"