perl意外的拆分行为

时间:2014-01-18 20:00:57

标签: 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 "$_\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+/ 它们都以相同的输出结束。

如果有人知道为什么会这样,以及如何让它消失,请分享 提前谢谢。

1 个答案:

答案 0 :(得分:3)

一个hexdump - 正如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:'
          ];

更新评论:

  1. A hexdump为您提供二进制数据的清晰视图;我用它来显示你调用fsutil时的真实情况。
  2. 我提到了XP,因为我不能排除fsutil在其他版本的Windows上返回一个带有不同分隔符的字符串。
  3. 通过使用正常表达式来削减你想要的东西(驱动器号)而不是潜伏在其中的东西,我试图提出一个解决方案,即使盖茨先生将零改为空格,制表符或“,”
  4. 您是否可以提供一个链接来解释“其他东西”对于未经证实的人的意思?