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