PERL意外的分裂行为



我正在尝试写下一个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";
}

最后的循环是打印检查。
我什么也没得到。我试图以另一种方式检查它:

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+/
他们最终都以相同的输出。

如果有人知道为什么会发生以及如何使它消失,请分享。
预先感谢。

a 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)比您预期的(在Win XP下进行测试)。

测试。

因此,要获取驱动器字母的列表,正则正则表达式可能是更好的方法:

$ my $res = `fsutil fsinfo drives`;
Drives: A: C: D: E: M:
$ $res =~ /bw:/g;
$ARRAY1 = [
            'A:',
            'C:',
            'D:',
            'E:',
            'M:'
          ];

更新WRT评论:

  1. Hexdump可让您清楚地了解二进制数据;我用它来显示您称为FSUTIL时真正得到的。
  2. 我提到了XP,因为我不能排除FSUTIL在其他版本的Windows上返回带有不同定系数的字符串。
  3. 通过使用剪切所需内容的正则表达式(驱动器字母),而不是潜伏在两者之间的内容,我尝试提出一个解决方案,即使盖茨先生将零更改为空格,标签或",",。
  4. 您能提供一个链接,将"其他东西"的含义解释给初学者?

最新更新