要拆分的向前斜線/
(由\
逃脫),而你顯然需要的\
。
由於\
本身逃逸的事情,你需要逃脫它,也
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的評論。
[splitdir](https://metacpan.org/pod/File::Spec#splitdir) –
@SinanÜnür阿。當然,模塊。謝謝!我會添加它。 – zdim