/proc文件系统包含正在运行的进程的详细信息。例如,在 Linux 上,如果您的 PID 为123,则该进程的命令行将在/proc/123/cmdline中找到
cmdline使用空字节来分隔参数。
我怀疑应该使用unpack但我不知道如何使用各种模板(“x”、“z”、“C*”、“H*”、“A*”等)只是不工作。
一个简单split("\0", $line)
的就可以完成这项工作。
您可以设置$/
为"\0"
. 例子:
perl -ne 'INIT{ $/ = "\0"} chomp; print "$_\n";' < /proc/$$/environ
我实际上并不推荐使用它,只是为了您的信息:本来可以工作的解压模板是unpack "(Z*)*", $cmdline
. Z
打包和解包以 null 结尾的字符串,但因为它是字符串类型,所以它是一个length之后的数字或星号,而不是重复 -Z*
解包一个任意长度的以 null 结尾的字符串。要解压其中的任意数量,需要将其包装在括号中,然后对括号组应用重复,这样就可以得到(Z*)*
.
这可以通过命令行开关-l
和来完成-0
,或者通过手动更改$/
.
-l
并且-0
是顺序相关的,可以多次使用。
感谢您启发我阅读perlrun文档。
# -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