Perl 做自己的 sprintf 格式化——它模拟 C 函数 sprintf,但是它没有用 C 的 sprintf。(注:除了浮点数以外,并且就算是浮点数也只允许标准的修饰词。)结果是,任何你本地的 sprintf(3) 函数的扩展都不能在 Perl 里使用。
Perl 的 sprintf 允许全局使用的已知转化在 表29-4 中列出。
表29-4。sprintf 的格式
另外,Perl 允许下列广泛支持的转换:
最后,为了向下兼容(我们的意思就是“向下”),Perl 允许下列不必要的但广泛支持的转换:
Perl 允许下列众所周知的标志出现在 % 和转换字符之间:
域 | 含义|
l | | 把整数解释成 C 类型的 long 或者 unsigned long|
还有两个 Perl 相关的标志
如果你的 Perl 理解“四倍数”(64位整数),不管是该平台本机支持还是因为你指明 Perl 带着该功能编译,那么字符 d u o x X b i D U O 打印64位整数,并且它们前面可以选择前缀 ll,L,或则 q。比如,%lld %16LX %qo。
如果 Perl 理解“long double”(要求该平台支持 long double),那么你可以在 e f g E F G 标志前面增加可选的 ll 或者 L。比如,%llf %Lg。
在标志里可以出现数字的位置,都可以用一个星号(“*”)代替,这时候 Perl 使用参数列表里的下一个项作为给出的数字(也就是说,当作域宽度或者精度)。如果通过“*”获取的域宽度是负数,那么它和“-”标志有一样的效果:左对齐。
v 标志可以用于显示任意字串里的序数值:
sprintf "version is v%vd\n", $^V; # Perl 的版本 sprintf "address is %vd\n", %addr; # IPv4 地址 sprintf "address is %*vX\n", ":", $addr; # IPv6 地址 sprintf "bits are %*vb\n", " ", $bits; # 随机的位串
sqrt EXPR
sqrt
这个函数返回 EXPR 的平方根。如果需要其他的根,比如立方根,你可以使用 ** 操作符求那个数字的分数幂。不要试图在着两种方法里使用负数,因为它有一些稍微有些复杂的问题(并且抛出一个例外)。但是有一个模块可以处理这些事情:
use Main::Complex; print sqrt(-2); # 打印出 1.4142135623731i
srand EXPR
srand
这个函数为 rand 操作符设置随机数。如果省略了 EXPR,那么它使用一个内核提供的半随机的数值(如果内核支持 /dev/urandom 设备)或者是一个基于当前时间和进程号以及一些其他东西的数值。通常我们完全没有必要调用 srand,因为如果你没有明确调用它,那么它也会在第一次调用 rand 操作符时隐含调用。不过,在早于 Perl 5.004 的版本里不是这样的,所以如果你的脚本需要在老 Perl 版本上运行,那么你就应该调用 srand。
那些经常被调用的程序(比如 CGI 脚本),如果只是简单地用 time ^ $$ 做的话,那么很容易惨遭下面的数学性质的攻击,那就是:有三分之一的机会 a^b == (a+1)^(b+1)。所以不要这么干。应该用下面的代码:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-28372-13.html
这还是跟排队来北京巡逻区别很大的
仅说数量了
狠狠的干小日本