怎样用printf实现“999,999”这样的输出?

能否详解一下此正则表达式?
  1 while s/((?:\A|[^.0-9])[-+]?\d+)(\d{3})/$1,$2/s;


QUOTE:
原帖由 dl0622 于 2008-10-19 19:57 发表
能否详解一下此正则表达式?
  1 while s/((?:\A|[^.0-9])[-+]?\d+)(\d{3})/$1,$2/s;

是啊,我也觉得很疑惑,它是怎么做到的?

还有这个:
        sub commify {
                local $_  = shift;
                1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
                return $_;
                }

local $_ = shift;表示什么意思?

我大概理解了:
local $_  = shift;  #表示取参数,就是999999999999
1 while s/^([-+]?\d+)(\d{3})/$1,$2/;   #只要符合正则式,就继续划分下去,该正则式是以+号或-号以及0个或多个数字开头的,以倒数第三个数字作为划分点的数字串;
离开了commify 子函数,$_恢复原值(local的作用)
对不?
perl这东西,很多时需要意会


QUOTE:
原帖由 dl0622 于 2008-10-19 21:02 发表
我大概理解了:
local $_  = shift;  #表示取参数,就是999999999999
1 while s/^([-+]?\d+)(\d{3})/$1,$2/;   #只要符合正则式,就继续划分下去,该正则式是以+号或-号以及0个或多个数字开头的,以倒数第三个数字作为划分点的数字串;
离开了commify 子函数,$_恢复原值(local的作用)
对不?

这个是怎么取呢?既然是从$_中取,直接 = 不就行了,为什么要shift?

离开了commify子函数,$_恢复原值?那它返回的格式化的值,到哪里去了?
返回的值不是return回去了吗?
其实先把字符串反序然后从左到右隔三位加一个逗号更加简单,而且效率会更高,因为没有正则的r回溯


QUOTE:
原帖由 churchmice 于 2008-10-19 22:18 发表
其实先把字符串反序然后从左到右隔三位加一个逗号更加简单,而且效率会更高,因为没有正则的r回溯

那么:
第一行的 local $_  = shift;这个是表示什么意思?



假设现在已经做了反序,下面这个表达式要怎样修改才可以实现:从左到右隔三位加一个逗号?
s/(\d{3})/$1,/s;

我试了好几种方式都不行:

s/(^\d)(\d{3})/$1,$2/s;
s/(\d)?(\d{3})/$1,$2/s;
s/(\d?)(\d{3})/$1,$2/s;
既然是反序了,那么$1就是(\d{3}),$2变为(\d+$),输出后再反序一次就可以了



QUOTE:
原帖由 jjqing 于 2008-10-19 22:34 发表
第一行的 local $_  = shift;这个是表示什么意思?

也可以写成local $_ = $_[0]; local ($_) = @_;
用local局部化全局变量$_(s///默认对$_进行匹配操作),这样调用函数后不修改原来全局$_的值。
sub commify {
    local $_  = shift;
    1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
    return $_;
}

$_ = "888888";
$a = 999999;
print $_, "\n";
print commify($a),"\n";
print $_, "\n";
print "$a\n";