在Perl中解析由空字节分隔的字符串
/proc文件系统包含运行进程的详细信息。例如,在Linux上,如果PID为123,则该进程的命令行将位于/proc/123/cmdline 正在使用空字节分隔参数在Perl中解析由空字节分隔的字符串,perl,null,unpack,Perl,Null,Unpack,/proc文件系统包含运行进程的详细信息。例如,在Linux上,如果PID为123,则该进程的命令行将位于/proc/123/cmdline 正在使用空字节分隔参数 我怀疑应该使用解包,但我不知道如何使用,我使用各种模板(“x”、“z”、“C*”、“H*”、“A*”等)的痛苦尝试根本不起作用。一个简单的拆分(“\0”、$line)就可以很好地完成这项工作。我并不建议使用这个,但仅供参考:可以使用的解包模板是unpack“(Z*)*”,$cmdlineZ打包和解压以空结尾的字符串,但因为它是字符串
我怀疑应该使用解包,但我不知道如何使用,我使用各种模板(“x”、“z”、“C*”、“H*”、“A*”等)的痛苦尝试根本不起作用。一个简单的
拆分(“\0”、$line)
就可以很好地完成这项工作。我并不建议使用这个,但仅供参考:可以使用的解包模板是unpack“(Z*)*”,$cmdline
Z
打包和解压以空结尾的字符串,但因为它是字符串类型,所以在长度之后是数字或星号,而不是重复-Z*
解压一个任意长度的以空结尾的字符串。要解包任意数量的代码,需要将其包装在括号中,然后对括号中的组应用重复,这将得到(Z*)*
您可以将$/
设置为“\0”
。例如:
perl -ne 'INIT{ $/ = "\0"} chomp; print "$_\n";' < /proc/$$/environ
perl-ne'INIT{$/=“\0”}chomp;打印“$\ \n””
这可以通过命令行开关-l
和-0
或手动更改$/
来完成
-l
和-0
取决于顺序,可以多次使用
感谢您鼓励我阅读文档
示例:
我的最终结果(能够读取原始命令行字符串)是通过执行
$line=~s/\0//g
(感谢lanzz的灵感)my@cmd=$line=~/([^\0]+)/g
可能更干净。如果您愿意,您只需使用“@cmd”
重新组装cmd即可。感谢您的澄清,很高兴了解有关打包/解包的信息。
# -0 : set input separator to null
# -l012 : chomp input separator (null)
# and set output separator explicitly to newline, octol 012.
# -p : print each line
# -e0 : null program
perl -0 -l012 -pe0 < /proc/$$/environ
# -l : chomp input separator (/n) (with -p / -n)
# and set output separator to current input separator (/n)
# -0 : set input separator to null
# -p : print each line
# -e0 : null program
perl -l -0 -pe0 < /proc/$$/environ
# partially manual version
# -l : chomp input separator (/n) (with -p / -n)
# and set output separator to current input separator (/n)
# -p : print each line
# -e : set input record separator ($/) explicitly to null
perl -lpe 'INIT{$/="\0"}' < /proc/$$/environ
# DOESN'T WORK:
# -l0 : chomp input separator (/n) (with -p / -n)
# and set output separator to \0
# -e0 : null program
perl -l0 -pe0
# DOESN'T WORK:
# -0 : set input separator to null (\0)
# -l : chomp input separator (\0) (with -p / -n)
# and set output separator to current input separator (\0)
# -e0 : null program
perl -0l -pe1