簡體   English   中英

在正則表達式中使用匹配組的長度

[英]Using the length of the matched group inside regex

假設這個

char=l
string="Hello, World!"

現在,我想在從STDIN讀取時替換string所有char但連續出現(運行長度編碼)

我試過這個:

$c=<>;$_=<>;print s/($c)\1*/length($&)/grse;

當輸入為

l
Hello, World!

它返回Hello, World! . 但是當我運行這個

$c=<>;$_=<>;print s/(l)\1*/length($&)/grse;

它返回He2o, Wor1d

所以,由於輸入是在單獨的行中給出的, $c包含\\n (檢查$c=~/\\n/ )所以,我試過了

$c=<>.chomp;$_=<>;print s/($c)\1*/length($&)/grse;

$c=<>;$_=<>;print s/($c.chomp)\1*/length($&)/grse;

都沒有工作。 誰能說一下為什么?

在 Perl 中, . 用於連接字符串,而不是調用方法(與其他一些語言不同;例如 Ruby)。 查看chomp文檔以了解它應該如何使用。 你應該做

chomp($c=<>)

而不是

$c=<>.chomp

因此,您的完整代碼應該是:

chomp($c=<>);$_=<>;print s/($c)\1*/length($&)/grse;

如果$c始終是單個字符,則正則表達式可以簡化為s/$c+/length($&)/grse 此外,如果$c可以是正則表達式元字符(例如, +*([等),那么您應該對其進行轉義(為了以防萬一,轉義它是有意義的)。為此,您可以使用\\Q..\\E (或quotemeta ,雖然它更冗長,因此可能不太適合單行):

s/\Q$c\E+/length($&)/grse

如果您不$c某種方式轉義$c ,並且您的單行使用(例如作為第一個輸入運行,您將收到以下錯誤:

Quantifier follows nothing in regex; marked by <-- HERE in m/(+ <-- HERE / at -e line 1, <> line 2

關於$c=<>.chomp在 Perl 中的實際含義(因為這是一個在某些上下文中有意義的有效 Perl 代碼):

$c=<>.chomp表示<>連接到chomp ,其中沒有參數的chomp被理解為chomp($_) chomp返回刪除的字符總數,由於$_為空,所以沒有刪除任何字符,這意味着這個chomp返回0 所以你基本上是在寫$c=<>.0 ,這意味着如果你的輸入是l\\n ,你最終會得到l\\n0而不是l

自己調試此類的一種方法是:

  • 使用-w標志啟用警告。 在那種情況下,它會打印

    Use of uninitialized value $_ in scalar chomp at -e line 1, <> line 1.

    這可以說不是有史以來最有用的警告,但它會幫助你了解你的錯誤在哪里。

  • 打印變量以確保它們包含您期望的內容。 例如,你可以 co perl -wE '$c=<>.chomp;print"|$c|"' ,它會打印:

     |l 0|

    這應該有助於讓您了解出了什么問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM