在一個Perl/Tk的代碼,我發現了一個條件語句如下在Perl中,if(s/^ + //)的含義是什麼?
if (s/^\+//)
{
#do something
}
elsif (/^-/)
{
#do another thing
}
好像一些模式匹配已經完成。但我無法理解它。任何人都可以幫我理解這種模式匹配嗎?
在一個Perl/Tk的代碼,我發現了一個條件語句如下在Perl中,if(s/^ + //)的含義是什麼?
if (s/^\+//)
{
#do something
}
elsif (/^-/)
{
#do another thing
}
好像一些模式匹配已經完成。但我無法理解它。任何人都可以幫我理解這種模式匹配嗎?
它們都是正則表達式。您可以在perlre和perlretut上閱讀。你可以在http://www.rubular.com上與他們玩。
它們都隱含地做了$_
。你的代碼行可能有一個while
或foreach
而沒有循環變量。在那種情況下,$_
成爲該循環變量。它可能包含正在讀取的文件的當前行。
$_
當前值包含+
(加號)作爲字符串,#do somehting
開始的第一個字符。-
(負號),#do another thing
。在案例1中,它也將該符號替換爲+
(即刪除它)。但它不會刪除2中的-
。
讓我們看看YAPE::Regex::Explain的解釋。
use YAPE::Regex::Explain;
print YAPE::Regex::Explain->new(qr/^\+/)->explain();
這是它。在我們的案例中不是很有幫助,但是卻是一個不錯的工具。請注意,(?-imsx
和)
部分是Perl暗示的默認東西。除非你改變它們,它們總是在那裏。
The regular expression:
(?-imsx:^\+)
matches as follows:
NODE EXPLANATION
----------------------------------------------------------------------
(?-imsx: group, but do not capture (case-sensitive)
(with^and $ matching normally) (with . not
matching \n) (matching whitespace and #
normally):
----------------------------------------------------------------------
^ the beginning of the string
----------------------------------------------------------------------
\+ '+'
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
更新:作爲米科L的評論中指出,應重構也許/更改這段代碼。雖然它可能做到了它應有的目標,但我相信這會讓它更具可讀性。誰寫的顯然不關心你作爲後來的維護者。我建議你這樣做。您可以將其更改爲:
# look at the content of $_ (current line?)
if (s/^\+//)
{
# the line starts with a + sign,
# which we remove!
#do something
}
elsif (m/^-/)
{
# the line starts witha - sign
# we do NOT remove the - sign!
#do another thing
}
這些是正則表達式,用於模式匹配和替換。
你應該在概念讀了,但你的問題:
s/^\+//
如果字符串開始有加,除去加(以下簡稱「s」表示「替代」),並返回true 。
/^-/
如果字符串以負號開頭,則爲true。
其他答案給出了代碼如何工作的總結,但沒有太多的原因。以下是爲什麼可以使用這種邏輯的一個簡單例子。
#!/usr/bin/env perl
use strict;
use warnings;
my $args = {};
for (@ARGV) {
if (s/^no//) {
$args->{$_} = 0;
} else {
$args->{$_} = 1;
}
}
use Data::Dumper;
print Dumper $args;
當你調用像
./test.pl hi nobye
腳本你
$VAR1 = {
'hi' => 1,
'bye' => 0
};
的關鍵是字符串,但是如果它是由no
前面,然後將其刪除(拿到鑰匙有問題),而是將值設置爲0
。
OP的例子有一點涉及,但遵循相同的邏輯。
+
鑰匙啓動,刪除它,然後做一些-
鑰匙啓動,請不要刪除它,做別的事情@downvoter,關心評論? –
@Oded,該鏈接ISN這是我見過的最糟糕的Perl教程,但它比較老,使用一些過時的做法('-w' vs'warnings',prototypes)。我可能會推薦['perldoc perlretut'](http://p3rl.org/retut)。 –
@JoelBerger - 夠公平的。這是谷歌第一次點擊。 – Oded
@Oded,NP。 Perl教程的長久性是社區通過製作/突出更新的更好的教程來努力爭取的,並且警告關於老教師/壞教師的問題http://perl-tutorial.org/。在互聯網泡沫帶來很多糟糕的代碼之後,Perl得到了一個不好的名字,我們試圖一次性改進一個教程。 –