2014-01-18 69 views
1

我想寫一個perl腳本,它能夠區分我的驅動器的不同標籤到特定的驅動器,然後在該驅動器中執行某些操作。
我在Windows XP計算機上運行Active Perl 5.16.3.1603。perl意外的拆分行爲

這裏是我寫的:

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+/
它們都以相同的輸出結束。

如果有人知道它發生的原因以及如何讓它消失,請分享。
在此先感謝。

+2

https://eval.in/91580看起來沒問題。 –

+0

當我試圖手動把字符串放在$ _中時它工作。 $ _ =「驅動器:C:\\ D:\\ E:\\ G:\\」 –

+1

執行'fsutil fsinfo drives'輸出的十六進制轉儲以確保您獲得實際空間字符。 – DavidO

回答

3

一個hexdump都 - 如建議由戴維

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評論:

  1. 一個hexdump給你一個明確的二進制數據視圖;我用它來展示你調用fsutil時的真正含義。
  2. 我提到了XP,因爲我不能排除fsutil在其他版本的Windows上返回帶有不同分隔符的字符串。
  3. 通過使用一個正則表達式來切割你想要的(驅動器字母)而不是潛在的內容,我試圖提出一種解決方案,即使蓋茨先生將零改爲空格,製表符或「,」 。
  4. 你能否提供一個鏈接,將「其他的東西」的含義解釋給外行?
+0

這是驚人的(雖然不可思議),輸出會非常髒,而且「污垢」記錄非常糟糕:https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us /fsutil.mspx?mfr=true – DavidO

+0

您的解決方案有效。 但是什麼是十六進制轉儲? 這是否意味着其他的東西將無法按預期在Windows XP上運行? –