10

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

cmdline使用空字节来分隔参数。

我怀疑应该使用unpack但我不知道如何使用各种模板(“x”、“z”、“C*”、“H*”、“A*”等)只是不工作。

4

4 回答 4

9

一个简单split("\0", $line)的就可以完成这项工作。

于 2012-06-18T14:27:44.390 回答
5

您可以设置$/"\0". 例子:

perl -ne 'INIT{ $/ = "\0"} chomp; print "$_\n";' < /proc/$$/environ
于 2012-08-18T05:08:51.143 回答
3

我实际上并不推荐使用它,只是为了您的信息:本来可以工作的解压模板是unpack "(Z*)*", $cmdline. Z打包和解包以 null 结尾的字符串,但因为它是字符串类型,所以它是一个length之后的数字或星号,而不是重复 -Z*解包一个任意长度的以 null 结尾的字符串。要解压其中的任意数量,需要将其包装在括号中,然后对括号组应用重复,这样就可以得到(Z*)*.

于 2012-06-18T14:49:38.720 回答
3

这可以通过命令行开关-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
于 2017-05-10T22:27:20.897 回答