前言
没记得小骆驼中提到了取整操作符,如果有就是我看得不仔细。
这篇记录主要是自用,毕竟学perl的还是太少了。
这里我在网上找了些教程,然后写了点脚本bug测试了下。才学perl
不久,可能有所疏漏或错误,请仔细辨别。
测试结果
重要内容往前提。
POSIX模块不需要额外安装。
对数值型标量取整
int
操作符:直接去掉小数部分,(我记忆为截断式取整)特点是不需要使用任何模块。
floor
操作符:不论正负数,始终向下取整,特点是需要调用use POSIX;
;
ceil
操作符:不论正负数,始终向上取整,特点是需要调用use POSIX;
;
POSIX::round
操作符:总是四舍五入,特点是调用方式需为POSIX::round
;
POSIX::lround
操作符:总是四舍五入,特点是调用方式需为POSIX::lround
;
POSIX::trunc
操作符:同int
操作符,直接去掉小数部分,特点是调用方式需为POSIX::trunc
;
对于后三种操作符的调用,有教程说是perl 5.22用的,但是使用use v5.22
后并不能直接使用round
等。暂时没找到其它调用方法。
对数值数组取整
以上6中操作符,在对数值数组@arr
取整时,会将 @arr
先转化为标量,即数组大小,然后再应用于操作符。
对字符型标量取整(纯属好奇测试)
实际过程中应该是没有人这么操作的,这里纯属测试。
#/usr/bin/env perl # -w 单独启用后并不报错,输出结果0
#use warnings; #开启后会有警告,但仍能输出0的结果。
#use strict; #开始后会直接报错。
perl
后添加-w
单独启用后并不报错,以上6种操作符输出结果0。
调用warnings
后会有警告,但仍能输出0的结果。
调用strict
后直接报错,无结果输出。
对数值标量与数值数组取整脚本
脚本使用
perl test.pl > test.pl.md
脚本内容
#/usr/bin/env perl
#name: test.pl
use strict;
use warnings;
#use POSIX;
#$\="\n"; #特殊变量,直接定义好输出后转行符号分割。与之类似的为$/,注意比较。
my @arr = (-2.8,-2.5,-2.4,-2,0,2,2.4,2.5,2.8);
my ($result,$item);
my @res_arr;
#################################
## 测试 int($x)
#################################
print '## 测试int($x)结果:',"\n";
sub myint{
foreach $item (@arr){
$result = int $item;
print '传入数值为:',"$item\t";
print 'int($x)结果为:',"$result\n";
}
@res_arr = int @arr || print 'ERROR: int @arr',"\n";
print "\@arr为:@arr\n";
print 'int(@arr)结果为:',"@res_arr\n";
}
&myint; #调用
print '- int($x)小结:小数部分直接被丢弃(我觉得可以称为截断式取整)',"\n";
print '- int(@arr)小结:int()不能用于数组,而int(@arr)会将@arr强制转换为标量,即数组大小,然后取整。与下面的floor()类似',"\n\n";
#################################
## 测试 POSIX::floor($x)
#################################
print '## 测试POSIX::floor($x)结果:',"\n";
print '需要添加模块`use POSIX;`',"\n";
sub myfloor{
use POSIX; #use POSIX;放入到封闭语块内仍可以全局调用;
foreach $item (@arr){
$result = floor $item;
print '传入数值为:',"$item\t";
print 'floor($x)结果为:',"$result\n";
}
@res_arr = floor @arr || print 'ERROR: floor @arr',"\n";
print "\@arr为:@arr\n";
print 'floor(@arr)结果为:',"@res_arr\n";
}
&myfloor;
print '- floor($x)小结:总是向下取整',"\n";
print '- floor(@arr)小结:floor()不能用于数组,而floor(@arr)会将@arr强制转换为标量,即数组大小,然后取整。与上面的init()类似',"\n\n";
#################################
## 测试 POSIX::ceil($x)
#################################
print '## 测试POSIX::ceil($x)结果:',"\n";
print '需要添加模块`use POSIX;`',"\n";
sub myceil{
#use POSIX;
foreach $item (@arr){
$result = ceil $item;
print '传入数值为:',"$item\t";
print 'ceil结果为:',"$result\n";
}
@res_arr = ceil @arr || print 'ERROR: ceil @arr',"\n";
print "\@arr为:@arr\n";
print 'ceil @arr 结果为:',"@res_arr\n";
}
&myceil;
print '- ceil($x)小结:总是向上取整',"\n";
print '- ceil(@arr)小结:ceil()只能用于数值型标量,不能用于数组,与上同',"\n\n";
#################################
## 测试 POSIX::round($x)
#################################
print '## 测试POSIX::round($x)结果:',"\n";
print '不能添加模块use POSIX;后使用round($x)。有点奇怪,知识盲区了。',"\n";
sub myround{
#use POSIX;
#use v5.22;
foreach $item (@arr){
$result = POSIX::round $item;
print '传入数值为:',"$item\t";
print 'POSIX::round结果为:',"$result\n";
}
@res_arr = POSIX::round @arr || print 'ERROR: POSIX::round @arr',"\n";
print "\@arr为:@arr\n";
print 'POSIX::round @arr结果为:',"@res_arr\n";
}
&myround;
print '- POSIX::round($x)小结:必须以POSIX::round($x)方式调用,不能声明`use POSIX;`后直接使用round($x)。有点奇怪,这个以后还得留意用法',"\n";
print '- POSIX::round($x)小结:总是四舍五入',"\n";
print '- POSIX::round(@arr)小结:POSIX::round()只能用于数值型标量,不能用于数组,与上同',"\n\n";
#################################
## 测试 POSIX::lround($x)
#################################
print '## 测试POSIX::lround($x)结果:',"\n";
print '不能添加模块use POSIX;后使用lround($x)。有点奇怪,知识盲区了。',"\n";
sub mylround{
#use POSIX;
#use v5.22;
foreach $item (@arr){
$result = POSIX::lround $item;
print '传入数值为:',"$item\t";
print 'lround结果为:',"$result\n";
}
@res_arr = POSIX::lround @arr || print 'ERROR: POSIX::lround @arr',"\n";
print "\@arr为:@arr\n";
print 'POSIX::lround @arr 结果为:',"@res_arr\n";
}
&mylround;
print '- POSIX::lround($x)小结:必须以POSIX::lround($x)方式调用。与上面的POSIX::round($x)相同',"\n";
print '- POSIX::lround($x)小结:总是四舍五入',"\n";
print '- POSIX::lround(@arr)小结:POSIX::lround()只能用于数值型标量,不能用于数组,与上同',"\n\n";
#################################
## 测试 POSIX::trunc($x)
#################################
print '## 测试POSIX::trunc($x)结果:',"\n";
print '不能添加模块use POSIX;后使用trunc($x)。有点奇怪,知识盲区了。',"\n";
sub mytrunc{
#use POSIX;
#use v5.22;
foreach $item (@arr){
$result = POSIX::trunc $item;
print '传入数值为:',"$item\t";
print 'trunc结果为:',"$result\n";
}
@res_arr = POSIX::trunc @arr || print 'ERROR: POSIX::trunc @arr',"\n";
print "\@arr为:@arr\n";
print 'POSIX::trunc @rr 结果为:',"@res_arr\n";
}
&mytrunc;
print '- POSIX::trunc($x)小结:必须以POSIX::trunc($x)方式调用。与上面的POSIX::round($x)相同',"\n";
print '- POSIX::trunc($x)小结:向下取整,与int相同',"\n\n";
print '- POSIX::trunc(@arr)小结:POSIX::lround()只能用于数值型标量,不能用于数组,与上同',"\n\n";
输出结果
## 测试int($x)结果:
传入数值为:-2.8 int($x)结果为:-2
传入数值为:-2.5 int($x)结果为:-2
传入数值为:-2.4 int($x)结果为:-2
传入数值为:-2 int($x)结果为:-2
传入数值为:0 int($x)结果为:0
传入数值为:2 int($x)结果为:2
传入数值为:2.4 int($x)结果为:2
传入数值为:2.5 int($x)结果为:2
传入数值为:2.8 int($x)结果为:2
@arr为:-2.8 -2.5 -2.4 -2 0 2 2.4 2.5 2.8
int(@arr)结果为:9
- int($x)小结:小数部分直接被丢弃(我觉得可以称为截断式取整)
- int(@arr)小结:int()不能用于数组,而int(@arr)会将@arr强制转换为标量,即数组大小,然后取整。与下面的floor()类似
## 测试POSIX::floor($x)结果:
需要添加模块`use POSIX;`
传入数值为:-2.8 floor($x)结果为:-3
传入数值为:-2.5 floor($x)结果为:-3
传入数值为:-2.4 floor($x)结果为:-3
传入数值为:-2 floor($x)结果为:-2
传入数值为:0 floor($x)结果为:0
传入数值为:2 floor($x)结果为:2
传入数值为:2.4 floor($x)结果为:2
传入数值为:2.5 floor($x)结果为:2
传入数值为:2.8 floor($x)结果为:2
@arr为:-2.8 -2.5 -2.4 -2 0 2 2.4 2.5 2.8
floor(@arr)结果为:9
- floor($x)小结:总是向下取整
- floor(@arr)小结:floor()不能用于数组,而floor(@arr)会将@arr强制转换为标量,即数组大小,然后取整。与上面的init()类似
## 测试POSIX::ceil($x)结果:
需要添加模块`use POSIX;`
传入数值为:-2.8 ceil结果为:-2
传入数值为:-2.5 ceil结果为:-2
传入数值为:-2.4 ceil结果为:-2
传入数值为:-2 ceil结果为:-2
传入数值为:0 ceil结果为:0
传入数值为:2 ceil结果为:2
传入数值为:2.4 ceil结果为:3
传入数值为:2.5 ceil结果为:3
传入数值为:2.8 ceil结果为:3
@arr为:-2.8 -2.5 -2.4 -2 0 2 2.4 2.5 2.8
ceil @arr 结果为:9
- ceil($x)小结:总是向上取整
- ceil(@arr)小结:ceil()只能用于数值型标量,不能用于数组,与上同
## 测试POSIX::round($x)结果:
不能添加模块use POSIX;后使用round($x)。有点奇怪,知识盲区了。
传入数值为:-2.8 POSIX::round结果为:-3
传入数值为:-2.5 POSIX::round结果为:-3
传入数值为:-2.4 POSIX::round结果为:-2
传入数值为:-2 POSIX::round结果为:-2
传入数值为:0 POSIX::round结果为:0
传入数值为:2 POSIX::round结果为:2
传入数值为:2.4 POSIX::round结果为:2
传入数值为:2.5 POSIX::round结果为:3
传入数值为:2.8 POSIX::round结果为:3
@arr为:-2.8 -2.5 -2.4 -2 0 2 2.4 2.5 2.8
POSIX::round @arr结果为:9
- POSIX::round($x)小结:必须以POSIX::round($x)方式调用,不能声明`use POSIX;`后直接使用round($x)。有点奇怪,这个函数以后还得留意用法
- POSIX::round($x)小结:总是四舍五入
- POSIX::round(@arr)小结:POSIX::round()只能用于数值型标量,不能用于数组,与上同
## 测试POSIX::lround($x)结果:
不能添加模块use POSIX;后使用lround($x)。有点奇怪,知识盲区了。
传入数值为:-2.8 lround结果为:-3
传入数值为:-2.5 lround结果为:-3
传入数值为:-2.4 lround结果为:-2
传入数值为:-2 lround结果为:-2
传入数值为:0 lround结果为:0
传入数值为:2 lround结果为:2
传入数值为:2.4 lround结果为:2
传入数值为:2.5 lround结果为:3
传入数值为:2.8 lround结果为:3
@arr为:-2.8 -2.5 -2.4 -2 0 2 2.4 2.5 2.8
POSIX::lround @arr 结果为:9
- POSIX::lround($x)小结:必须以POSIX::lround($x)方式调用。与上面的POSIX::round($x)相同
- POSIX::lround($x)小结:总是四舍五入
- POSIX::lround(@arr)小结:POSIX::lround()只能用于数值型标量,不能用于数组,与上同
## 测试POSIX::trunc($x)结果:
不能添加模块use POSIX;后使用trunc($x)。有点奇怪,知识盲区了。
传入数值为:-2.8 trunc结果为:-2
传入数值为:-2.5 trunc结果为:-2
传入数值为:-2.4 trunc结果为:-2
传入数值为:-2 trunc结果为:-2
传入数值为:0 trunc结果为:0
传入数值为:2 trunc结果为:2
传入数值为:2.4 trunc结果为:2
传入数值为:2.5 trunc结果为:2
传入数值为:2.8 trunc结果为:2
@arr为:-2.8 -2.5 -2.4 -2 0 2 2.4 2.5 2.8
POSIX::trunc @rr 结果为:9
- POSIX::trunc($x)小结:必须以POSIX::trunc($x)方式调用。与上面的POSIX::round($x)相同
- POSIX::trunc($x)小结:向下取整,与int相同
- POSIX::trunc(@arr)小结:POSIX::lround()只能用于数值型标量,不能用于数组,与上同
对字符型标量取整
脚本使用
perl test2.pl
脚本内容
#/usr/bin/env perl # -w 单独启用后并不报错,输出结果0
#use warnings; #开启后会有警告,但仍能输出0的结果。
#use strict; #开始后会直接报错。
use POSIX;
my $a = a;
my $a_res = int $b;
print "1. $a_res\n";
my $b = b;
my $b_res = ceil $b;
print "2. $b_res\n";
my $c = c;
my $c_res = floor $c;
print "3. $c_res\n";
my $d = d;
my $d_res = POSIX::round $d;
print "4. $d_res\n";
my $e = e;
my $e_res = POSIX::lround $e;
print "5\n $e_res\n";
my $f = f;
my $f_res = POSIX::trunc $f;
print "6. $f_res\n";
输出结果
输出到屏幕。前面的数字加.是计数用的,后面的0为结果。
1. 0
2. 0
3. 0
4. 0
5. 0
6. 0
小结
思路不够清晰,测试中,不断地把新想法加进去,搞得自己有点乱。
网友评论