垂直输出到水平输出

时间:2015-09-12 12:53:24

标签: regex perl

对于下面的代码,我将输出一个在另一个之下(垂直);但是我想要的只是一行(水平)。

use strict;
use warnings;   
use Getopt::Std;

use vars qw($opt_a $opt_d $opt_m $opt_n $opt_o $opt_s $opt_t $opt_l);
my $drives = `wmic volume get name`; 
$drives =~ s/Name //;
print $drives;

应该是:

C:\ D:\ F:\ Q:\ X:\

但是,我得到的是:

C:\ 
D:\ 
F:\ 
Q:\ 
X:\

2 个答案:

答案 0 :(得分:1)

使用tr///

将新行字符替换为空格
$drives =~ s/Name //;
$drives =~ tr/\r\n/ /;
print $drives;

或使用s///

$drives =~ s/Name //;
$drives =~ s/[\r\n]/ /g;
print $drives;

注意:\r\n是换行符。

答案 1 :(得分:0)

为此目的,在列表上下文中使用反引号运算符最为简单;即将输出分配给数组。这样,每个数组元素将获得一行输出

您可能还想删除网络共享,因此对于以字母和冒号开头的行,grep将提取这些内容

最后,如果你使用wmic或类似的方式查看Data::Dump的输出,你会看到这些行用空格填充,以便它们都与最长的行一样长。您可以使用子代码来使用这些不需要的空格,这也将删除尾随的CR和LF

喜欢这个

use strict;
use warnings;

my @drives = grep /^[A-Z]:/, `wmic volume get name`;
s/\s+\z// for @drives;

print "@drives\n";

输出

这是我自己的Windows系统上面代码的输出

X:\ E:\ D:\ L:\ R:\ C:\ P:\ H:\ I:\ S:\ T:\ U:\ J:\ M:\ N:\ O:\ F:\ G:\ Q:\