对于下面的代码,我将输出一个在另一个之下(垂直);但是我想要的只是一行(水平)。
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:\
答案 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:\