[英]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.