Perl脚本求助

Perl脚本求助

大家好啊~在看Perl学习手札的时候遇到个练习,不知道应该怎么实现啊~请大家帮帮忙指导一下啊~谢谢了

2. 利用sprintf做出货币输出的表示法,例如:136700以$136,700,26400以$26,400表示。
先来个不用sprintf的

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my $data = shift;
$data =~ s/(?<=\d)(?=(?:(\d\d\d)+)$)/,/g;
$data =~ s/^/\$/;
print "$data\n";

运行结果

QUOTE:
<lig@other-server:~/chinaunix>$ ./format 13749394739
$13,749,394,739

注释:

QUOTE:
?=<  是lookback positiveassertion(往回看,就是看左边,如果匹配则为真)
?=    是lookahead positive assertion(往前看,就是看右边,如果匹配则真)
?:     是non capture grouping (对括号内的内容不产生捕捉,用于提高效率和以后修改方便,意味着不能通过$1或者类似的形式捕捉到)



[Copy to clipboard] [ - ]
CODE:
$data =~ s/^/\$/;



QUOTE:
这一条作用很简单,就是在最前面(匹配^)插入了一个$符号



[Copy to clipboard] [ - ]
CODE:
$data =~ s/(?<=\d)(?=(?:(\d\d\d)+)$)/,/g;



QUOTE:
这条有些复杂,总的意思是寻找一个位置
对这个位置的一些约束是:
1.位置以左有一个数字,通过往走看实现  (?<=\d)
2.位置以右是3的倍数个数字,通过(?=(?\d\d\d)+))实现,其中?:是non capture grouping,作用在上面已经说过了,看个人喜好,去掉也可以
3.在3的倍数个数字以后是字符串的终结

对符合这个条件的位置插入","
g是global match and substitute,在正则引擎从左到右bump along的时候处理所有匹配点

可以用如下的代码看具体的匹配过程

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my $data = shift;
#$data =~ s/((?<=\d)(?=(?:(\d\d\d)+)$)/,/g;
$data =~ s/(?{print "Starting match at $`|$'\n"})(?<=\d)(?=(?:(\d\d\d)+)$)(?{print "Matched at $`<$&>$'\n"})/,/g;
$data =~ s/^/\$/;
print "$data\n";

运行结果

QUOTE:
<lig@other-server:~/chinaunix>$ ./format 33455655343
Starting match at |33455655343
Starting match at 3|3455655343
Starting match at 33|455655343
Matched at 33<>455655343
Starting match at 33|455655343
Matched at 33<>455655343
Starting match at 334|55655343
Starting match at 3345|5655343
Starting match at 33455|655343
Matched at 33455<>655343
Starting match at 33455|655343
Matched at 33455<>655343
Starting match at 334556|55343
Starting match at 3345565|5343
Starting match at 33455655|343
Matched at 33455655<>343
Starting match at 33455655|343
Matched at 33455655<>343
Starting match at 334556553|43
Starting match at 3345565534|3
Starting match at 33455655343|
$33,455,655,343

其中:1.

[Copy to clipboard] [ - ]
CODE:
(?{perl code})

是embeded code,简单的说就是在匹配过程中打印一些信息
2.

[Copy to clipboard] [ - ]
CODE:
$` $' $&

这三个变量代表匹配前,匹配后,匹配的内容
从效率方面考虑,要避免使用

以上知识全都来自于,mastering regular expression(精通正则表达式),我看的是英文版,所以有些对应的中文翻译不好,直接用英文了,大家别见怪
希望我已经说清楚了

你要sprintf的话
再加上
my $res = sprintf("%s",$data);
恩~谢谢了~学习下  :)
老大~能不能解释一下这个匹配什么意思啊?

$data =~ s/(?<=\d)(?=(?\d\d\d)+)$)/,/g;

读不懂啊~
Perl cookbook
看不懂二楼兄弟写的。。
$data =~ s/(\d+?)(?=((\d\d\d)+)$)/$1,/g;
[quote]原帖由 sumin_0527 于 2008-1-31 16:23 发表
老大~能不能解释一下这个匹配什么意思啊?
参见二楼说明
bow

谢谢老大的详细解释啊~~


QUOTE:
原帖由 churchmice 于 2008-1-31 15:42 发表
先来个不用sprintf的

#!/usr/bin/perl
use strict;
use warnings;
my $data = shift;
$data =~ s/(?

高手,好帖子