[請益] 記憶圓括號

看板Perl作者 (瑞)時間15年前 (2009/12/30 12:17), 編輯推噓5(506)
留言11則, 4人參與, 最新討論串1/1
因為手邊沒有書..所以使用的符號可能不對..請見諒 問題一 假如我有一文件..想要列出所有以數字開頭的列.. 並且將所有的數字都整理成三位數..如果是1..就改成001..若是11..改為011 if( m/^(\d+)/ ){ if ( length($1) == 1) { $1 = "00"."$1" ; } if ( length($1) == 2) { $1 = "0"."$1" ;} } 可是我這樣寫的話反而一位數和二位數的都會不見..而且會有error訊息 問題二 如果我想將圓括號找到的值交由副常式再處理.. if( m/(符合條件的行列)){ $num = &hex($1); } sub hex{ #想要再這裡將$1再做一次記憶圓括號的篩選 if ( m/(再進行一次條件篩選)/ ){ return $1 ; } } 但這樣就出現問題..副常式回傳的仍是第一次圓括號找出來的值.. 有什麼方式可以使副常式回傳的是第二次篩選出來的值啊?? 問題三 我常會將perl當普通指令來改檔案..perl -pi -e 's/.../.../g' 檔案 也常會用到記憶圓括號.. 但一直有個問題解決不了.. 若我要篩出以數字結尾的行列..並將最末端的數字都改成0.. perl -pi -e 's/(.*)\d/$10/g' 檔案 可是就出問題了..因為系統會判成將找到的行列改為第10個記憶圓括號的值.. 而不是我要的..將找到的行列改為第一個記憶圓括號的值再接個0.. 如果是寫成程式就好解決了.. print "$1"."0\n"; 但因為我是用一行指令..就對它束手無策了.. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.169.72 ※ 編輯: RueyJing 來自: 123.195.169.72 (12/30 12:18)

12/30 13:48, , 1F
用兩行不就?
12/30 13:48, 1F

12/30 13:57, , 2F
$1是暫時的scalar應該不是原本地方的指標吧
12/30 13:57, 2F
因為常常要修改很多檔案..直接用指令快很多.. 而且..重點不是一行或二行.. 是我想知道$1後接個數字到底要怎樣寫.. 因為常會用到..每次都要另想方法避開很麻煩

12/30 21:43, , 3F
if ( m/^(\d+)/ ) { $number = sprintf("%3d",$1); }
12/30 21:43, 3F

12/30 22:27, , 4F
perl -pi -e 's/\d$/0/g
12/30 22:27, 4F

12/30 22:27, , 5F
' 檔名
12/30 22:27, 5F
歹勢..可能我舉的例子不好..我是想知道如果硬要$1後接個數字.. 到底應該怎樣寫才對 ※ 編輯: RueyJing 來自: 123.195.169.72 (12/30 23:49) ※ 編輯: RueyJing 來自: 123.195.169.72 (12/30 23:54)

12/31 00:00, , 6F
二樓三樓其實是一個意思 如果一定要加個數字 可以是一行...
12/31 00:00, 6F

12/31 00:01, , 7F
perl -pi -e 's/(.*)\d/$1ㄎㄎ/g;s/ㄎㄎ$/0/g' 檔名
12/31 00:01, 7F

12/31 00:18, , 8F
perl -pi -e 's/(.*)\d/$1ㄎㄎ/g;s/ㄎㄎ/0/g' 檔名
12/31 00:18, 8F

12/31 00:18, , 9F
好像也沒省到甚麼
12/31 00:18, 9F

01/02 22:03, , 10F
to snowfly, "%03d"
01/02 22:03, 10F

01/02 22:06, , 11F
${1}
01/02 22:06, 11F
文章代碼(AID): #1BEjHlAc (Perl)
文章代碼(AID): #1BEjHlAc (Perl)