Perl进阶

Perl编程实践:从基础到进阶示例 本文介绍了多个Perl编程任务,涵盖基础语法和进阶应用。包括如何输出'Hello, world'、计算圆周长、用户输入处理、字符串操作、文件权限检查以及简单的游戏开发等内容。每个任务均提供了详细的代码示例和运行说明,适合初学者通过实践掌握Perl语言的核心特性。 阅读详情


根据网易云课程整理,禁转

子程序sub编写

  • 子程序声明sub
  • 子程序可以传入数组/哈希
  • 默认变量@_ 用于传递参数
  • 子程序调用&
  • 变量的作用域:子程序中定义的变量作用域只能在子程序中调用,子程序可以调用全局变量
  • 返回值return

Perl 子程序(函数)

#子程序示例
sub hello{
	my($name) = @_; 
	#传入的是一个数组 @_,列表上下文将数组第一个元素赋值给$name
	print "Hello $name !\n";	
}
&hello("Tom","Lucy"); 

sub hello1{
	print "Hello $_[0] !\n";
	#从数组@_中获取第一个元素,效果同上(不是$_老地方)
}
&hello1("Tom","Lucy"); 


#数组求和
sub sumNum{
	my@num=@_;
	my $sum = 0;
	for my$n(@num){
		$sum=$sum+$n;
	}
	return $sum;
}
my $all = &sumNum(1..5);
print "$all\n";

#哈希打印
sub show_hash{
	my %hash = @_;
	for my $k(keys %hash){
		print"$k: $hash{$k}\n";
	}
}
&show_hash({"name"=>"a", "number"="b"});

命令行参数传递

内置变量@ARGV
使用@ARGV传递参数可以使脚本更通用
数组:用于存储命令行里的字符串

open(IN, "$ARGV[0]") or die"$!";
open(OUT, "$ARGV[1]") or die "$!";

命令行:perl my_script.pl ./test.txt ./out.txt
注意:文件传入顺序必须对应

打印使用帮助

示例
die "perl $0 <in> <out>" unless(@ARGV == 2);
$0 特殊标量,脚本名
只有当传入参数为2个时,命令运行,否则die,并打印die后的字符串

perl调用系统命令

  • system 可以批量调用系统命令
    也可以调用perl程序system("perl my_perl.pl");
    可以用``代替,如:`perl my_perl.pl`; 效果同上
    如果system里的命令正常退出,返回0;非正常退出返回错误信息
  • glob 可以批量抓取一个目录中的文件,返回一个数组
    可以指定前缀glob(D:/1*)D盘下开头为1的文件
    可以指定后缀glob(D:/*fasta)D盘下结尾为fasta的文件
  • 注意:最好写文件的绝对路径

数据:
在/home/perl_test/fasta_files/文件夹下有n个fasta文件,文件名为 编号.fasta
用于比对的参考序列 ref.fa
要求:
写一个perl脚本my_perl.pl,用blastall对n个fasta文件进行批量比对

my $dir = "/home/perl_test/";
my @files = glob("$dir/fasta_files/*fasta");

for my $i (@files){
	print "$i\n";  	#检查输入文件路径
	print "blastall -i $i -d $dir/blastdb/ref.fa -e 1e-10 -p blastp -m 8 -o $i.out\n";  	#检查命令行
	my $err = system("blastall -i $i -d $dir/blastdb/ref.fa -e 1e-10 -p blastp -m 8 -o $i.out");  	#调用系统命令
	
	if($err){
		print "$err\n";
	}		#如果有错误打印错误信息
}

命令行输入:perl my_perl.pl

perl中使用第三方包

在脚本开头调用包:use 包名 qw(变量名/方法名);

命令行安装示例:cpan Data::Dumper

use strict;
# 创建变量时必须用my进行声明

use Data::Dumper;
# 打印变量,比如哈希
print Dumper (\%hash);

use List::Util qw(sum max min);
#求数组和,最大值,最小值
my @num = (1..5);
my $sum_num = sum(@num);
print "$sum_num\n";
路径处理包
use FindBin qw($BIn $Script);
# $BIn,$Script为包中自带变量
# $Bin 存储脚本所在根目录
# $Script 存储脚本文件名
# 方便用于流程编写时调用同级目录中的脚本
print "\$Bin: $Bin\n";

use File::Basename qw(basename dirname);
# 处理环境路径
if (@ARGV>0){
	print "\$ARGV[0]: $ARGV[0]\n";
	my $bname = basename($ARGV[0]); #路径最后一个文件名/文件夹名
	print "basename: $bname\n";
	my $dname = dirname($ARGV[0]);
	print "dirname: $dname\n";
}

use Cwd qw(abs_path getcwd);
# getcwd 返回使用者使用的当前路径
my $present_work_dir = getcwd();
print "\$present_work_dir: $present_work_dir\n";

# abs_path 返回文件的绝对路径
my $absP = abs_path($ARGV[0]);
print "\$absP: $absP\n";
Getopt::Long传递参数
use strict;
use Geropt::Long;
use Data::Dumper;

my @libs = ();
my %flags = ();
my ($verbose, $all, $help, $test, $step, $type) = ();

GetOptions(
	'help!'	=> \$help,
	'step:i'	=> \$step,
	'type=s'	=> \$type,
	'lib=s'	=> \@libs,
	'flag=s'	=> \%flags,
	'test|t:s'	=> \$test,
	'all|everything|universe:s'	=> \$all,
);

# 'help!'	接有!的选项不接受变量( -help 直接使用)
			只要命令行中出现了这个参数,就会默认是1,用来设置打开/关掉一个功能
# : 和 = 都可以接受字符串(s)、整数(i)、浮点(f)等类型的变量
# 'step:i'	接有:的选项可以接受缺省,0或者空字符串(比如-step 	那么$step的值为0)
# 'type=s'	接有=的选项不接受缺省(比如-type 	相当于没设置)
# 'lib=s'	如果相关联的变量是个数组,比如此处的@libs,那么选项可以多次出现,所有值将被追加进数组(-lib /test.txt -lib /test1.txt)
# 'flag=s'	如果相关量的变量是个哈希,那么选项接收一个键值对,并保存进哈希(-flag aa=1 -flag bb=1)
# 'test|t:s'	接有| 的选项表示可以将-test简写为-t
# 'all|everything|universe:s'	表示all everything universe都指向$all
#备注:GetOptions可以自动简化命令,所有选项可以被简写为唯一的最短字符串,如果首字母相同会加上第二字母来区分,效果跟写全相同(比如-help在命令行中可以写成-h)
#在匹配参数名的时候,GetOptions在缺省设置下会忽略大小写
				


sub USAGE{
	my $usage = <<"USAGE"; #注意<<,将下面的内容原样存在$usage中
	Usage:
	Options:
		-verbose		whether do somthing
		-help		note
		-step		note
		-type		note
		-lib		test \@ #因为是字符串,所以@需要转义
		-flag		test \%
		...
USAGE #到这里结束存储,注意USAGE顶格
	print $usage;
	exist;
}
&USAGE unless (!$help); 
#unless如果判断语句为false,执行(即:如果输入-help将打印帮助)
&USAGE unless (!$help and $type); 
#意思是$type里必须有值,如果没有输入值,也会打印帮助
$step||=1;
#||意思是如果前面的部分为false,那么变量赋值为1(即:如果$step没有输入值,那么默认赋值为1)注意一个bug:如果$step 0那么也会自动赋值为1


#测试代码
print "\$verbose :$verbose\n";
print "\$help:$help\n";
print "\$step:$step\n";
print "\@libs:@libs\n";
print "\%flags: ".Dumper(\%flags)."\n";
print "\$test:$test\n";
print "\$all:$all\n";
37、Perl编程技巧与进阶知识 本博客深入探讨了Perl编程语言的多个高级主题,包括文件链接操作、正则表达式的应用、信号处理机制、包的使用方法,以及性能优化技巧。通过详细的代码示例和实际应用案例分析,读者可以掌握Perl在复杂任务处理和大型项目开发中的应用,适合有一定基础并希望进一步提升编程能力的开发者。 阅读详情

相关推荐

1、掌握 Perl 编程:进阶之路与大师之道

本文详细介绍了成为 Perl 编程大师的进阶之路,涵盖了高级正则表达式、安全编程技术、调试器使用、性能分析、代码清理等关键主题。适合已经掌握 Perl 基础知识的开发者深入学习,并通过实践与交流不断提升技能。文中还提供了学习路径流程图和多个实用技巧,帮助读者全面掌握 Perl 的高级特性和最佳实践。

d6e7f8的博客 85

Perl 语言进阶学习

本文详细介绍了 Perl 语言的高级特性,包括高级数据结构、引用、面向对象编程、异常处理、文件操作、网络编程、数据库操作、自动化测试和模块开发等内容。通过掌握这些高级功能,您可以在更复杂的编程任务中游刃有余,提升编程效率和代码质量。希望本文能帮助您进一步深入学习 Perl 语言,并在实际项目中发挥其强大功能。

power_9的博客 1132

2、掌握 Perl 编程:进阶指南与高级正则表达式

本文是一篇关于Perl编程语言的进阶指南,重点介绍高级正则表达式的使用技巧和最佳实践。内容涵盖正则表达式的引用、匹配选项、实际应用示例、性能优化及调试技巧,并通过丰富的代码示例帮助读者深入理解如何高效处理文本数据。文章还介绍了成为Perl大师的学习路径,适合已经掌握Perl基础的开发者进一步提升技能。

p5l2m9n4o6q的博客 102

Perl 语言学习进阶

可以使用CPAN客户端来安装和管理这些模块。为了解决这个问题,可以使用现代的Perl框架,如Mojolicious和Dancer2,它们提供了一些现代化的特性和工具,使得Perl开发更加高效和现代化。阅读Perl相关的书籍和文档:有许多优秀的Perl书籍和文档可以帮助你深入学习Perl的库和框架。可读性和维护性:Perl的灵活性和强大的语法使得代码可读性较低,尤其当使用过多的特殊符号和简化写法时。为解决这个问题,可以采用良好的命名规范,注释代码,使用模块化和面向对象的编程风格,以提高代码的可读性和维护性。

runqu的博客 1566

Nginx进阶使用:Perl模块与Lua集成

本文深入探讨了Nginx服务器的高级功能,包括如何使用Perl模块进行请求处理和服务器映射,以及如何集成Lua以增强Web服务器的可编程性和性能。通过实例和配置示例,文章展示了Nginx在处理特定Web逻辑时的灵活性和效率。

weixin_35732273的博客 988

perl语言进阶

高清版,带目录索引,适合有一定基础的同学深入学习。

PLEAC-Perl 教程 - Hash (Perl进阶者极力推荐)

<!--google_ad_client = "pub-5143338080895292";/* 728x90, created 4/10/08 */google_ad_slot = "8165396160";google_ad_width = 728;google_ad_height = 90;//--> <script type="text/javascript"

OpenBSD 咨询与维护 784

高级perl编程(第二版)pdf

高级perl编程(第二版)pdf

Perl 从入门到进阶:知识点详解与实践指南

Perl 是一种功能强大、灵活的脚本语言,适用于多种开发场景。通过本文的介绍,读者可以快速掌握 Perl 的基础知识、核心特性、流行框架和最佳实践。希望这些内容能帮助你在 Perl 的学习和开发中取得成功。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 782

Perl高效编程.(第2版).pdf

中文名: Perl高效编程 (第2版) 中文版 原名: Effective Perl Programming Ways to Write Better, More Idiomatic Perl, 2nd Edition 作者: (美) 霍尔 (美) 麦克亚当斯 (美) 福瓦译者: 盛春 等 资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社书号: 9787115250469发行时间: 2011年05月01日 地区: 大陆 语言: 简体中文 简介: 内容简介   本书是Perl 编程领域的“圣经级”著作。它提供了一百多个详实的应用案例,足以涵盖编程过程中经常遇到的方方面面,由此详细阐释出各种高效且简洁的写法。本书第1 版曾畅销十年之久,而在第2 版中不仅修正了前版存在的一些问题,更与时俱进地引入了许多Perl 领域的新主题,使内容更加完善丰富,也更具实用性。   本书为初级Perl 程序员铺就了一条通往高阶之路,而对高级Perl 程序员来说,本书也是必备的技术参考。 目录: 第1章 Perl基础 第2章 Perl的地道用法 第3章 正则表达式 第4章 子程序 第5章 文件与文件句柄 第6章 引用 第7章 CPAN 第8章 Unicode 第9章 软件分发 第10章 测试 第11章 警告信息 第12章 数据库 第13章 杂项

perl高效编程第2版 带书签pdf扫描版

perl高效编程第2版 带书签pdf扫描版 这个是带完整目录书签的扫描版

【Perl语言】深入理解Perl语言的进阶特性

内容涵盖了Perl语言的进阶特性,通过详细的解释和示例代码,相信你能够更深入地理解和掌握Perl的强大功能。继续实践和探索,你将发现Perl在不同应用场景中的巨大潜力。

weixin_52938153的博客 1101

开关变换器分析:大信号模型与小信号模型

是电力电子系统建模中的两类基本方法,分别用于描述系统在不同工作条件下的动态行为。它们的核心区别在于是否对变量进行线性化近似,以及适用的分析场景。

创新改变世界! 1907

3、perl进阶

1、条件判断与循环结构(if (unless)  while(until)   for   foreach   next last redo) if (unless)    关系运算符:     数字关系运算符(>,>=,<,<=,==,!=)        字符串关系运算符(gt,ge,lt,le,eq,ne)     数字中0是假,其余是真;字符...

weixin_30723433的博客 177

【车间调度】车间调度问题的分类

本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流。 车间调度问题的分类 根据工件和车间构成不同,车间调度问题可分为以下几种 1.单机调度问题 在单机调度问题(S,SMP)中,加工系统只有一台机床,待加工的工件有且仅有一道工序,所有工件都在该机床上进行加工。此问题是最简单的调度问题,当生产车间出现瓶颈机床时的调度就可视为此调度问题。 ...

weixin_51656605的博客 7430

logisim实验——通过2个半加器实现1-bit全加器,通过4个一位全加器构成4-bit加法器(详解)

一、由异或门和与门所构成的半加器: 二、由两个半加器构成的1-bit全加器: ..

zep 1万+

Perl进阶知识点(2)

为什么80%的码农都做不了架构师?>>> ...

weixin_33769125的博客 278

claude使用教程

提供了三种模型:claude,codex, gemini,三种模型都共用同一个apikey, 有开发需求使用claude效果较好,知识问答等场景gemini效果会更好些,本文只提供了claude的安装方式,剩下两种按需按照以下参考链接安装下即可,安装有问题参考文档:https://www.aicodemirror.com/dashboard/official-installation/macos-linux (不需要挂梯子,自己手机号注册就好)

lichao19871216的博客 3487

47、Perl编程的进阶知识与实用技巧

本文深入探讨了Perl编程的进阶知识与实用技巧,涵盖XML数据处理、国际化与本地化、脚本安全与污点检查、PerlScript在Windows中的应用、Perl 6的架构变革,并通过Q&A和实践练习帮助读者掌握核心概念。同时提供了学习建议与常见错误分析,助力开发者提升Perl编程能力。

kmeans3miner的博客 36

ESP32-C3微型9轴感知模块的硬件工程实践

在嵌入式系统小型化趋势下,低功耗微控制器与多传感器融合成为智能终端的基础技术路径。其核心原理在于芯片能效比、射频合规性与电源噪声抑制的协同优化,技术价值体现在降低认证门槛、提升EMC鲁棒性及保障MEMS传感器精度。典型应用场景包括可穿戴设备、微型无人机姿态控制和工业边缘传感节点。本文围绕ESP32-C3平台展开,深入解析QFN封装选型逻辑、同步降压电源设计、LSM9DS1九轴校准策略等关键环节,覆盖FCC/CE认证规避、USB-C接口EMC防护等高频工程痛点。

weixin_42607969的博客 367

SAP批量程序(一)-静态批量EX,FX和期间批量MB,WB和TB

SAP批量程序(一)-静态批量和区间批量

weixin_38974136的博客 5478

PLEAC-Perl 教程 - Directories (Perl进阶者极力推荐)

<!--google_ad_client = "pub-5143338080895292";/* 728x90, created 4/10/08 */google_ad_slot = "8165396160";google_ad_width = 728;google_ad_height = 90;//--> <script type="text/javascript"

OpenBSD 咨询与维护 931

ICC2:postmask ECO参考脚本

更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 882
上一篇: 根据id提取fasta序列
下一篇: 代谢依赖驱动微生物共存
ruby912
博客等级 码龄9年 83粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值