如何使用-0选项读取Perl中的固定宽度记录?

wu-*_*lee 5 perl command-line-interface fixed-width

所以我知道你可以编写Perl单行程序,用非默认记录分隔符读取记录,例如

perl -064 -ne '#... delimited by @'
Run Code Online (Sandbox Code Playgroud)

或者将整个文件放在一行:

perl -0777 -ne '#... file at once'
Run Code Online (Sandbox Code Playgroud)

我也知道,如果您以编程方式将记录分隔符设置$\为对数字的引用,则可以读取固定宽度的记录.

perl -ne '$/ = \10; #... 10 chars at a time'
Run Code Online (Sandbox Code Playgroud)

但我找不到的是使用该-0选项读取固定宽度记录的任何配方.这可能吗?

ike*_*ami 9

没有命令行开关.

来自perlrun,

-0 [八进制/十六进制]

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

find . -name '*.orig' -print0 | perl -n0e unlink
Run Code Online (Sandbox Code Playgroud)

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

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

当然,您可以使用以下内容:

perl -ne'BEGIN { $/ = \10 } ...'
Run Code Online (Sandbox Code Playgroud)

要么

perl -e'$/ = \10; while (<>) { ... }'
Run Code Online (Sandbox Code Playgroud)