2017-08-26 18 views
-1
use Data::Dumper qw(Dumper); 

@arr=split('\/',"\Program Files\Microsoft VisualStudio\VC98\Bin\Rebase.exe"); 

print(Dumper \@arr); 

輸出:如何在 perl中分割一個字符串?

$VAR1 = [  

'Program FilesMicrosoft VisualStudioVC98BinRebase.exe' 

]; 

需要的輸出:

$VAR1 = [  
'Program Files', 

'Microsoft VisualStudio', 

'VC98', 

'Bin', 

'Rebase.exe' 
]; 

回答

7

要拆分的向前斜線/(由\逃脫),而你顯然需要的\

由於\本身逃逸的事情,你需要逃脫它,也

use warnings; 
use strict; 
use feature 'say'; 

my $str = '\Program Files\Microsoft VisualStudio\VC98\Bin\Rebase.exe'; 

my @ary = split /\\/, $str; 

shift @ary if $ary[0] eq ''; 

say for @ary; 

什麼打印路徑組件,每行一個。

由於這個字符串以\@ary第一元件將是空字符串開始,如在先於第一\。我們通過shift將其從陣列中移除,並附上一張支票。

請注意,該字符串一個必須使用'',或操作形式q(...),因爲雙引號試圖插值字符串中的推定逃逸\P\M(ETC),以警告失敗。當需要插入變量時,對文字字符串使用''並將""(或qq())使用是個好主意。

另一種方式做,這是用正則表達式

my @ary = $str =~ /[^\\]+/g; 

否定字符類[^...],與(逃脫)\比賽不是\任何字符。量詞+意味着至少有一次這樣的匹配是儘可能多次匹配的。因此,這匹配到第一個\的字符序列。

使用修飾符/g,匹配會繼續通過字符串查找所有這些模式。

指定給一個數組可將匹配運算符置於列表上下文中,其中返回匹配項列表並將其分配給@ary。在標量上下文中,只返回true(1)或false(空字符串)。

這裏不需要捕獲(),因爲我們想要所有匹配的東西。 通常他們是需要的,以便只有被捕獲的匹配被返回。

有了這個我們不用擔心在開始一個空字符串,因爲在第一\之前沒有比賽,因爲有之前沒有任何字符,而我們要求至少一個非\


但是,使用路徑是常見的,並且有準備好的工具可以處理細節。核心模塊File::Spec是多平臺和其splitdir斷路徑成組件

use File::Spec; 

my @path_components = File::Spec->splitdir($str); 

第一元件再次是一個空字符串,如果路徑與\(或/在Unix /蘋果機)開始。

感謝Sinan Ünür的評論。

+1

[splitdir](https://metacpan.org/pod/File::Spec#splitdir) –

+1

@SinanÜnür阿。當然,模塊。謝謝!我會添加它。 – zdim