Perl

perl 的 -0 選項究竟是如何工作的?

  • March 27, 2015

根據man perlrun

-0[octal/hexadecimal]
    specifies the input record separator ($/) as an octal or
    hexadecimal number. If there are no digits, the null character is
    the separator. 

The special value 00 will cause Perl to slurp files in paragraph
mode.  Any value 0400 or above will cause Perl to slurp files
whole, but by convention the value 0777 is the one normally used
for this purpose.

但是,鑑於此輸入文件:

This is paragraph one

This is paragraph two.

我得到了一些意想不到的結果:

$ perl -0ne 'print; exit' file ## \0 is used, so everything is printed
This is paragraph one.

This is paragraph two.

$ perl -00ne 'print; exit' file ## Paragraph mode, as expected
This is paragraph one.

到現在為止還挺好。現在,為什麼這兩個似乎也可以在段落模式下工作?

$ perl -000ne 'print; exit' file 
This is paragraph one.

$ perl -0000ne 'print; exit' file 
This is paragraph one.

為什麼這一個顯然又在吞食整個文件?

$ perl -00000ne 'print; exit' file 
This is paragraph one.

This is paragraph two.

進一步的測試表明,這些似乎都可以在段落模式下工作:

perl -000 
perl -0000
perl -000000
perl -0000000
perl -00000000

雖然這些似乎破壞了整個文件:

perl -00000
perl -000000000

我想我的問題是我對八進制的理解不夠好(真的),我是生物學家,而不是程序員。0000後兩者是否會因為兩者和00000000都是slurp 整個文件>= 0400?還是發生了完全不同的事情?

八進制就像十進制一樣,因為 0 == 0、0000 == 0、0 == 000000 等等。這裡的開關-0可能會讓事情變得有點混亂——我想關於“特殊值​​”的觀點00”表示一個0代表開關,一個代表值;添加更多的零不會改變後者,所以你得到同樣的東西……

在一定程度上。etc.的行為000000有點類似於 bug,但請記住,這應該是指單個 8 位值。十進制的 8 位範圍是 0-255,八進制的範圍是 0-377。所以你不可能在這裡有意義地使用超過 3 位數字(特殊值都在該範圍之外,但仍然是 3 位數字 + 開關)。您可能只是從以下方面推斷出這一點:

您還可以使用十六進製表示法指定分隔符:-0xHHH…,其中 H 是有效的十六進制數字。**與八進制形式不同的是,**這種形式可用於指定任何 Unicode 字元,甚至是 0xFF 之外的字元。

0xFF 十六進制 == 255 十進制 == 377 八進制 == 最大 8 位,一個字節的大小和(擴展的)ASCII 集中的一個字元。

引用自:https://unix.stackexchange.com/questions/192485