Perl基础实例—计数

统计数据是Perl最常用的功能。 今天我们通过一个简单的例子来看下如何统计数据。

题目:统计下列字符串中所有字母出现的次数

ATCCCGAAGGTAGATAACCGATTAGACG

分析:

我们需要统计每个字母出现的次数, 因此我们可以选用散列这个数据结构来进行数据的存储以及统计。

先定义数据和散列:

我们先把字符串根据单个字符拆分成字符数组:

split 是系统内置函数, 作用是将字符串根据给定的分隔符, 切分成数组。第一个参数是分隔符, 第二个参数是被分隔的字符串, 返回值是被切分出来的数组。

这里我们使用空分隔符, 也就是会将每个字符单独分割出来成为单独的元素。这样@strs数组中的每个元素, 都是单个的字符。

接下来, 我们遍历整个@strs数组, 统计每个字符

++是自增运算符, 作用是+1, 也就是下面2个方式是等效的:

$hash{$char}++

这行代码中,其实我们将所有的统计逻辑都写在的里面

下面我们用更啰嗦的方式看下这行代码的具体内容:

上面这几行代码和$hash{$char}++是等效的。

为什么我们可以不判断就直接自增呢?

我们具体根据if成立和不成立2种情况来看,

  1. 当if成立时, 也就是当前这个字符串作为key在我们的散列%hash中存在的, 那也就是说, 这个字符至少出现了一次。这个时候我们直接+1是没有问题的, 同时也将该字符这次出现统计了进去
  2. 当if不成立时, 也就是当前这个字符串作为key在我们的散列%hash中不存在, 那也就是说, 这个字符是第一次出现, 那我们应该给他赋值1(就像我们上面的else中的代码一样)。那为什么我们直接自增也可以呢?因为在Perl中, 当数据不存在(也就是undef)时, 在标量环境(记住, 一定是在标量环境下)下进行数字运算, 这个数据会被当作0来进行处理, 也就是说我们自增的时候相当于 0 + 1, 这样就等于直接赋值1了。

当我们遍历完整个数组时, 我们已经知道所有字符出现的次数了。下面我们将结果排序, 再打印出来:

sort也是系统内置函数, 作用是用来排序, 花括号里面的内容为排序的规则(这边的意思是根据数字大小反向排序, 具体sort的用法以后详细说)。

这边我们使用sort将散列中的数据, 根据value的值, 从大到小排列以后, 再依次输出:

统计数据次数, 是Perl中使用散列数据唯一性这个特性比较常见, 也是比较高效的功能。

VB6与Perl、Julia拼接速度测试

VB6与其它语言字符串拼接速度测试之七 (Perl、Julia)

应读者要求,本文将继续进行VB6与其它编程语言的字符串拼接速度的测试。下面将进行Perl、Julia的字符串速度拼接测试,如有不足之处请指出,将予以修正。为保证测试结果的公平,以下测试都是Release模式,32位优先,命令行(管理员身份)方式调用。

测试代码

#!/usr/bin/perl -w

use Time::HiRes qw( gettimeofday );

my ($seconds, $microseconds) = gettimeofday;

$starttime=$seconds*1000+(0.0+ $microseconds)/1000.0;

$strout = \”\”;

for($a=0;$a<10000000;$a+=1){

$strout.=\”AAAAA\”;

}

#print(\”strout = $strout\\n\”);

my ($e_seconds, $e_microseconds) = gettimeofday;

$endtime=$e_seconds*1000+(0.0+ $e_microseconds)/1000.0;

printf \”拼接一千万字符共用时%.0f毫秒\\n\”,$endtime-$starttime;

测试结果

耗时822毫秒

using Dates

using Printf

# 获得计算机当前时间

starttime = Dates.now()

arrStr=[]

for i in 1:10000001

append!(arrStr,\”AAAAA\”)

end

str1=join(arrStr,\”\”)

# 获取过段时间后的时间

endtime = Dates.now()

# 计算时间差并以豪秒的格式输出

delta = endtime – starttime

totaltime=Dates.value(delta)

@printf(\”拼接1千万字符串花费时间:%d毫秒\”,totaltime)

测试结果

耗时4376毫秒

拼接性能排行榜

perl基础——数组

今天我们介绍perl的另一种基础数据结构—数组。

数组, 顾名思义就是数据的组合, 数组用来存储一系列的标量值。在Perl中, 数组使用@作为标识符。

定义/申明一个数组和标量类似:

my @users;

在讲数组赋值前, 我们先引入另一个定义—列表直接量。列表直接量是用逗号分隔的一系列独立值:

给数组赋值时, 我们有2种方法, 一种即使用列表直接量:

以上2个是等效的, qw为Perl内置函数, 可以统一引起字符串。

在Perl中,数组中的元素是按照一定顺序来进行存放的, 因此, 我们也可以通过数组下标来给数组赋值, Perl中下标都是从0开始计算的:

从数组中取值和赋值是一样的:

Perl是支持负数下标的, 负数下标就是从最后一个元素开始, 反向读取。

数组的长度同样有2种常用方式:

具体原理后面讲数据环境的时候会解释。

常见的数组相关操作方法:

push–pop

pop和push是一组互逆的操作, push是将一个标量(也可以是数组,以及其他数据结构)放入到数组的末尾, pop则是将数组的最后一个元素取出。

需要注意的是,pop取出的元素, 会从数组中删除, 通过下标来读取的元素, 仍然在数组中。

unshift–shift

push/pop是在数组的尾部来进行处理, 那么对应的在数组头部来进行处理, 我们就使用unshift/shift。

数组相关最佳实践:

数组的命名规则同标量类似, 只是数组的名称一般使用复数, 以此来和标量的单个元素进行区分。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。