我的思想現在被阻塞了,為什么這沒有按我的預期作業:
$ echo 'JOHN, BO PEEP, BoPeep' | perl -0777ne 'map { print ($_) if $_ ne uc($_) } split /,/'
BoPeep
$ echo 'JOHN, BO PEEP, BoPeep' | perl -0777ne 'map { print lcfirst($_) if $_ ne uc($_) } split /,/'
BoPeep
這兩個命令之間的唯一區別是print ($_)vs print lcfirst($_),而我期望它print lcfirst($_)會輸出boPeep。
我錯過了什么?
更新:
樣本輸入:
JOHN, BO PEEP, BoPeep, AVG, Hex_String_Literal, Time_String, MODULE
uj5u.com熱心網友回復:
問題是僅以逗號分隔會在每個術語中留下前導空格。
解決這個問題的一種方法是在此處拆分所有可能出現在感興趣的令牌之間的內容/\s*,\s*/(回想一下,拆分需要一個完整的合法正則運算式)。其他簡化
echo "JOHN, BO PEEP, BoPeep, AVG, Hex_String_Literal, Time_String, MODULE"
| perl -nlE'$_ ne uc($_) and say lcfirst($_) for split /\s*,\s*/'
這會在單獨的行上列印單詞boPeep, hex_String_Literal, 。time_String要如圖所示列印它們,在由空格分隔的一行上,我們需要更多。例如
perl -nE'say join " ", map { $_ ne uc($_) ? lcfirst($_) : () } split /\s*,\s*/'
這使用一個技巧來過濾,通過為全大寫單詞map傳遞一個空串列,該串列在整個輸出串列中被展平為空。()或者,過濾然后進一步處理
perl -nE'say join " ", map { lcfirst($_) } grep { $_ ne uc($_) } split /\s*,\s*/'
這會從頭到尾處理串列,然后使用 遍歷其剩余專案的輸出串列split,這可能比一次遍歷整個串列中的三元組效率要低一些,但這肯定不會以任何合理的方式顯示作業負荷。grepmap
一些評論
我已經放棄了
-0777,因為我不確定它的實用性——如果它在檔案上運行并且需要處理文本中的多行塊,那么無論如何我們都需要一些其他的規定。如果逐行進行,則不需要它。如果需要,把它放回去:)提供(以及所有其他功能!)的便捷
-E開關在未來兼容性方面并不好。如果那是或可能成為問題,那么使用,或者當然,并保留而不是sayCORE::sayprint "...", "\n"-e-E
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/420218.html
標籤:
上一篇:要從一個圓圈中切出一塊,我必須先手動進行數學計算。有沒有更聰明的方法可以使用Python和opencv來完成這項作業?
