2015-10-04 24 views
-1

這裏是整個腳本:Perl的不區分大小寫的正則表達式不工作

#!/usr/bin/perl 
use v5.14; use warnings; 

my $reg = qr/test/i; 

say "matched 1" if $reg =~ "test"; # matches 
say "matched 2" if $reg =~ "Test"; # no match 

第一種情況相匹配,第二個沒有。我究竟做錯了什麼?

回答

6

的結合操作=~,並在正則表達式

"test" =~ $reg; 
+0

這是奇怪的。爲什麼情況1能夠正常工作,而不是情況2如果順序錯誤?無論如何謝謝你。 – felwithe

+2

因爲情況1被解釋爲''(?^ ui:test)'=〜/ test /',而第二個被解釋爲''(?^ ui:test)'=〜/ Test /'。在[perlre](http://p3rl.org/perlre)中搜索「字符串化」。 – choroba

2

這是奇怪的。爲什麼這很重要?

在大多數操作員中參數的順序是顯着的;交換運營商是一個罕見的。

  • 2/3是從3/2
  • 2 - 3不同距離3 - 2
  • 2 > 3不同距離3 > 2
  • 2 << 3不同距離3 << 2
  • $x = 2不同距離2 = $x
不同

我明顯可以繼續。同樣的道理也適用於!=!~%&&****=++=,--=->......///<<<<===>=~>>=>>^andgegtlelt,or,x||~~。而這是不具有一個以上的參數,也表現爲功能,如splitsplicejoinopen等所有的事情考慮提命名的運營商,我驚訝你覺得離奇的是=~是不可交換的

爲什麼情況1工作,但不是情況2,如果他們在錯誤的順序?

因爲在$reg =~ "test",Perl的要挾$reg爲一個字符串,給人(?^ui:test)和字符串到一個正則表達式,從而qr/test/。所以它

say "matched 1" if "(?^ui:test)" =~ /test/; 

因爲(?^ui:test)確實含有test這是成功的。然而,它包含Test所以

say "matched 1" if "(?^ui:test)" =~ /Test/ 

打印什麼

+0

參數的順序對於'=='和'eq'很重要嗎?因爲那是我的誤解。當我(現在看到的)不是的時候,我正在考慮'=〜'就像一個平等運算符。 – felwithe

相關問題