Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中解析由空字节分隔的字符串_Perl_Null_Unpack - Fatal编程技术网

在Perl中解析由空字节分隔的字符串

在Perl中解析由空字节分隔的字符串,perl,null,unpack,Perl,Null,Unpack,/proc文件系统包含运行进程的详细信息。例如,在Linux上,如果PID为123,则该进程的命令行将位于/proc/123/cmdline 正在使用空字节分隔参数 我怀疑应该使用解包,但我不知道如何使用,我使用各种模板(“x”、“z”、“C*”、“H*”、“A*”等)的痛苦尝试根本不起作用。一个简单的拆分(“\0”、$line)就可以很好地完成这项工作。我并不建议使用这个,但仅供参考:可以使用的解包模板是unpack“(Z*)*”,$cmdlineZ打包和解压以空结尾的字符串,但因为它是字符串

/proc文件系统包含运行进程的详细信息。例如,在Linux上,如果PID为123,则该进程的命令行将位于/proc/123/cmdline

正在使用空字节分隔参数


我怀疑应该使用解包,但我不知道如何使用,我使用各种模板(“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