前言
用perl统计文件行数。
这里是选择了之前推文中"Carya.fasta.p3in
"文件 。
重点小结
这是对于我自己来说的重点。毕竟主要还是写给自己看,也就这么排版了。
- 直接将文件读入
数组
,利用标量上下文
统计行数 - for 和while的循环读入每行后计数。对行数计数的标量,一定要定义到循环之前。
- 调用linux命令
wc -l
统计行数:用反引号 ` ` ;用system()或者exec() (涉及到父子进程,没系统学过linux,不是很理解其应用)。这种用法将结果直接赋值给标量,然后打印标量,不用接换行符也可自动换行。还有个问题,就是这部分脚本内容结束后无法再打印出来其它内容,也还不知道具体什么原因。
单独总结下File::CountLines
模块
从github上看,该包从2010年后没再维护。可能跟包的功能比较简单有关,作者觉得没必要再搞太多事。
-
模块地址:
meta::cpan :https://metacpan.org/pod/File::CountLines
安装
该包无法通过conda安装。
我这里使用的是conda环境下的perl编译的,最后安装地址也是自动装到了conda下路径。
git clone git://github.com/moritz/File-CountLines.git
File-CountLines/
perl Makefile.PL
make
make install
- 调用File::CountLines :
use File::CountLines qw(count_lines)
; - 基础用法
use File::CountLines qw(count_lines);
my $no_of_lines = count_lines('/etc/passwd'); #一般就不需要设置分割方式style,默认native。
- 指定具体的换行符
my $carriage_returns = count_lines(
'path/to/file.txt' #文件
style => 'cr', #指定分割方式
);
# possible styles are 'native' (the default), 'cr', 'lf'
# native 默认的style值,以"\n" 为换行符。大多数情况是没问题的。
# cr 以回车作为行分隔符(MacOS风格)
# lf 以换行符作为行分隔符(Unix风格)
# crlf 以回车后跟换行符作为分隔符(Microsoft Windows风格)
- “高级”用法
可以指定任意分割符进行统计,个人理解就是设定了"$/
"。但是这个用法,我尝试半天没写出来,暂时还不知道是什么问题。
my $list = count_lines($life, separator => '\end{itemize}');
脚本test.pl内容
#!/usr/bin/env perl
use strict;
use warnings;
#############################
## name:test.pl
#############################
print "## 标量上下文统计行数:\n";
open P3IN,"<","Carya.fasta.p3in" || die;
my @array=<P3IN>;
my $line_index1 = @array;
print "- 读入数组后标量上下文统计行数:$line_index1\n\n";
print "## for 统计行数:\n";
my $line_index2;
foreach my $line (@array){
$line_index2++;
}
print "- for循环统计行数:$line_index2\n\n";
close P3IN;
##################################
print "## while 统计行数:\n";
open P3IN,"<","Carya.fasta.p3in" || die;
my $total_num;
while (<P3IN>){
$total_num ++;
}
print "- while统计行数:$total_num\n\n";
close P3IN;
################################
use File::CountLines qw(count_lines);
print "## File::CountLines 统计行数\n";
my $nu_of_lines = count_lines('./Carya.fasta.p3in');
print "- File::CountLines统计行数:$nu_of_lines\n\n";
#my $lists = count_lines("Carya.fasta.p3in", separator => '\end{itemize}');
#print "File::CountLines统计SSR涉及引物模块数:$lists\n\n";
################################
print "## 调用linux系统命令统计行数\n";
my $total = `wc -l Carya.fasta.p3in`;
print $total; #直接换行?
my $total2 = system("wc -l Carya.fasta.p3in");
print $total2;#直接换行?
my $total3 = exec("wc -l Carya.fasta.p3in");
print $total3;#直接换行?
################################
脚本运行及结果
执行perl test.pl > test.md
得到的内容
## 标量上下文统计行数:
- 读入数组后标量上下文统计行数:432
## for 统计行数:
- for循环统计行数:432
## while 统计行数:
- while统计行数:432
## File::CountLines 统计行数
- File::CountLines统计行数:432
## 调用linux系统命令统计行数
432 Carya.fasta.p3in
432 Carya.fasta.p3in
0432 Carya.fasta.p3in