作者RueyJing (瑞)
看板Perl
標題[請益] 記憶圓括號
時間Wed Dec 30 12:17:48 2009
因為手邊沒有書..所以使用的符號可能不對..請見諒
問題一
假如我有一文件..想要列出所有以數字開頭的列..
並且將所有的數字都整理成三位數..如果是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)
1F:→ paulpu:用兩行不就? 12/30 13:48
2F:→ paulpu:$1是暫時的scalar應該不是原本地方的指標吧 12/30 13:57
因為常常要修改很多檔案..直接用指令快很多..
而且..重點不是一行或二行..
是我想知道$1後接個數字到底要怎樣寫..
因為常會用到..每次都要另想方法避開很麻煩
3F:推 snowfly:if ( m/^(\d+)/ ) { $number = sprintf("%3d",$1); } 12/30 21:43
4F:推 paulpu:perl -pi -e 's/\d$/0/g 12/30 22:27
5F:→ paulpu:' 檔名 12/30 22:27
歹勢..可能我舉的例子不好..我是想知道如果硬要$1後接個數字..
到底應該怎樣寫才對
※ 編輯: RueyJing 來自: 123.195.169.72 (12/30 23:49)
※ 編輯: RueyJing 來自: 123.195.169.72 (12/30 23:54)
6F:推 paulpu:二樓三樓其實是一個意思 如果一定要加個數字 可以是一行... 12/31 00:00
7F:→ paulpu:perl -pi -e 's/(.*)\d/$1ㄎㄎ/g;s/ㄎㄎ$/0/g' 檔名 12/31 00:01
8F:→ paulpu:perl -pi -e 's/(.*)\d/$1ㄎㄎ/g;s/ㄎㄎ/0/g' 檔名 12/31 00:18
9F:→ paulpu:好像也沒省到甚麼 12/31 00:18
10F:推 tkyifang:to snowfly, "%03d" 01/02 22:03
11F:推 MistQ:${1} 01/02 22:06