美文网首页
perl基础 | perl 中取整(1):基础取整操作符

perl基础 | perl 中取整(1):基础取整操作符

作者: 学生信的大叔 | 来源:发表于2022-05-22 23:06 被阅读0次

前言

没记得小骆驼中提到了取整操作符,如果有就是我看得不仔细。

这篇记录主要是自用,毕竟学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

小结

思路不够清晰,测试中,不断地把新想法加进去,搞得自己有点乱。

参考

perl:取整、四舍五入、向上取整、向下取整
四舍五入数字在Perl

相关文章

网友评论

      本文标题:perl基础 | perl 中取整(1):基础取整操作符

      本文链接:https://www.haomeiwen.com/subject/szmlprtx.html