【发布时间】:2013-07-27 06:02:53
【问题描述】:
我正在尝试解析pvdisplay(8) 的输出,它为每个物理卷打印一个单独的“段落”:
--- Physical volume ---
PV Name /dev/sdb
VG Name vg_virtual_01
PV Size 16.37 TiB / not usable 2.25 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 4291533
Free PE 3830989
Allocated PE 460544
PV UUID zqi1Q6-tIag-ghQy-MmdJ-kyOS-XkmY-HpyQ51
--- Physical volume ---
PV Name /dev/sda
VG Name vg_virtual_02
PV Size 16.37 TiB / not usable 2.25 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 4291533
Free PE 1525709
Allocated PE 2765824
PV UUID BlYvJW-ieVx-AjRg-p3r6-e4oC-TkPc-u2lf7x
够简单吧?
#!/usr/bin/perl
use strict;
use warnings;
my @pvs = do {
local $/ = '';
`pvdisplay`;
};
事实证明,并没有我想象的那么简单。由于我的数组只得到一个项目,在键盘上敲了半个小时后,我意识到段落之间的空白行实际上在 EOL 之前包含额外的空格。根据 perlvar,$/ 如果设置为空字符串,则将空行视为终止符,但需要注意的是空行不能包含任何空格或制表符。当然,$/ 是一个字符串,而不是一个正则表达式,所以我不能将它设置为 /^\s+$/ 之类的东西。
我能看到的唯一方法是首先将输出保存到一个文件中,去掉无关的空格,然后将其读回,但我不想为这么简单的东西创建一个临时文件。有没有更优雅的方法来做到这一点?
编辑:我可以使用 split(/^\s+$/m) 来做到这一点,但我只是好奇是否有办法通过更改 $/
【问题讨论】:
标签: perl whitespace paragraph backticks