例如,我知道
perl -l00e
相当于
$/ = "\n"; $\ = "\000";
它同时设置$INPUT
& $OUTPUT_RECORD_SEPARATOR
。
这个开关的其他“技巧”是什么?
答案 0 :(得分:1)
好的,对于perl -l00e
,\OOO
是null 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"