2016-03-16 67 views
4

我見過的cpan文檔模塊這個perl代碼:S [] []符號在Perl

$filename =~ s[^.+/][]; 

這是什麼意思?我已習慣s函數的s//表示法。

+1

相關:[?哪些呢Š{SOMESTR} {$ MYVAR}意味着在Perl(http://stackoverflow.com/q/18354691/176646),[在Perl正則表達式中的大括號](http://stackoverflow.com/q/22454089/176646) – ThisSuitIsBlackNot

回答

10

Perl允許將任何非空白字符用作字符串分隔符。見Quote and Quote-like Operators

包圍字符都是成對使用的,像<...>[...](...){...},而單引號防止插值。否則,功能等同於默認的分隔符

。在這種情況下

$filename =~ s[^.+/][] 

相同

$filename =~ s/^.+\/// 

,但更具可讀性

我傾向於選擇管字符|,看起來與通常的斜線相似

$filename =~ s|^.+/|| 

但選擇是你

+0

但是在我給出的代碼中有'['和']'字符,所以它不僅僅是'/'字符的替換。還有其他事情正在發生。 – CJ7

+3

@ CJ7請參閱[docs for's ​​///'](http://perldoc.perl.org/perlop.html#s%2f_PATTERN_%2f_REPLACEMENT_%2fmsixpodualngcer):「任何非空白分隔符都可以代替斜線。 ..如果PATTERN是用括號引號分隔的,則REPLACEMENT有它自己的一對引號,這些引號可以是也可以不是括號引號,例如's(foo)(bar)'或'/bar /'。 「 – ThisSuitIsBlackNot

+1

@ CJ7你也可以使用[B :: Deparse](https:// metacpan)來證明這一點。org/pod/B :: Deparse):'perl -MO = deparse -e's [foo] [bar]''打印's/foo/bar /;' – ThisSuitIsBlackNot

0

這只是一個替代模式分隔符。根據模式的細節 - 特別是,如果模式中有斜線 - 如果除了斜線之外的東西用作分隔符,人類可能更容易解析表達式。在這種情況下,它有點邊緣,但是,如果你使用的斜線它是這樣的:

$filename =~ s/^.+\///; 

您可以立即看到它難以找出哪些斜槓是圖案的一部分,其界定的格局。在這種情況下,最後的第三個斜槓是該模式的一部分,並被解釋爲結束模式,因此必須逃脫。

+0

但是在我給出的代碼中同時存在'['和']'字符,所以它不僅僅是'/'字符。還有其他事情正在發生。 – CJ7

+0

[是]的自然「夥伴」,嚴格地說,我想你是對的 - 但除了用[和另一個]替換一個'/'外,它實際上是相同的。你可以看到以這種方式解釋這個模式有多容易 - 最後,另一個回答者有超過84k點並且說同樣的事情 - 不太可能(他)是錯的,是的? ;-) – Marty