作者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