Regex perl意外的拆分行为

Regex perl意外的拆分行为,regex,perl,split,Regex,Perl,Split,我正在尝试写一个perl脚本,它将能够区分特定驱动器的不同标签,然后在特定驱动器中执行某些操作。 我正在windows XP计算机上运行Active Perl 5.16.3.1603 以下是我写的: use strict; $_ = `fsutil fsinfo drives`; my @drives = split; my @labels; for (@drives) { push @labels, `label $_`; } for (@labels) { print "$_

我正在尝试写一个perl脚本,它将能够区分特定驱动器的不同标签,然后在特定驱动器中执行某些操作。
我正在windows XP计算机上运行Active Perl 5.16.3.1603

以下是我写的:

use strict;
$_ = `fsutil fsinfo drives`;
my @drives = split;
my @labels;
for (@drives)
{
    push @labels, `label $_`;
}
for (@labels)
{
    print "$_\n";
}
末尾的for循环是打印检查。
结果我一无所获。我试着用另一种方式检查:

use strict;
$_ = `fsutil fsinfo drives`;

print;
print "\n";
print join "\n", split;
我的结果是:

Drives: C:\ D:\ E:\ G:\

Drives:
C:\ D:\ E:\ G:\
为什么拆分行为不符合其应有的方式?
我尝试了
split”“
split/
split/\s+/

它们最终都得到相同的输出

如果有人知道它为什么会发生以及如何让它消失,请分享。

提前感谢。

一个hextdump-按照DavidO的建议

00000000h: 0D 0A 44 72 69 76 65 73 3A 20 41 3A 5C 00 43 3A ; ..Drives: A:\.C:
00000010h: 5C 00 44 3A 5C 00 45 3A 5C 00 4D 3A 5C 00 0D 0A ; \.D:\.E:\.M:\...
显示您得到的(前导/尾随CrLf)和其他(00而不是20)空格比您可能预期的多(在Win XP下测试)

因此,要获得驱动器号列表,一个正的正则表达式可能是更好的方法:

$ my $res = `fsutil fsinfo drives`;

Drives: A:\ C:\ D:\ E:\ M:\

$ $res =~ /\b\w:/g;
$ARRAY1 = [
            'A:',
            'C:',
            'D:',
            'E:',
            'M:'
          ];
更新wrt注释:

  • A为您提供了二进制数据的清晰视图;我用它来显示调用fsutil时真正得到的结果
  • 我提到了XP,因为我不能排除在其他版本的windows上,fsutil返回带有不同分隔符的字符串
  • 通过使用一个正则表达式来剪切您想要的内容(驱动器号),而不是隐藏在两者之间的内容,我试图提出一种解决方案,即使盖茨先生将零更改为空格、制表符或“,”也能奏效
  • 你能提供一个链接,向不熟悉的人解释“其他东西”的含义吗

  • 看起来没问题。当我试图手动将字符串放入$\uu时,它成功了。$\u=“驱动器:C:\\D:\\E:\\G:\\”对
    fsutil fsinfo驱动器的输出执行十六进制转储,以验证您得到的是实际的空格字符。这在Windows 7上运行良好。在命令行
    perl-MData::Dumper-e“+$Data::Dumper::Useqq;print Dumper$\=`fsutil fsinfo drives`”
    这很神奇(虽然不是难以置信),输出会如此脏,而且“脏东西”的文档记录非常糟糕:您的解决方案工作正常。但是什么是十六进制转储?这是否意味着其他东西在windows xp上无法正常工作?