perl编写之前的一些习惯细节

2023-11-09

下述信息,仅供自己编写新脚本之前的回顾内容。编写perl脚本,处理好下面介绍的内容,那么脚本阅读性就完全满足个人眼光了。
虽然perl有很多实用的模块,可以利用;但是不使用模块编写代码,更容易理解。

变量

无非就是标量、数组、散列。

  • 散列是以字符串作为索引的。
  • 这里建议:建立新变量的时候,赋值为空。即使用到的所有变量,都不能undef。(或者判断变量是否满足什么条件时,推荐用defined先判别变量值是否undef,否则会引起不必要的麻烦)
  • 相关变量集合,尽量用散列来吸收;不要定义太多变量。这样方便理解,更方便perl -d做debug分析的时候,watch这个变量。
  • 变量命名,最好统一使用一个规则。个人推荐帕斯卡命名法;如果加一个小写字母表明变量类型就更好了。

关于散列和数组的数据类型,如何选用?
个人理解,索引号简单(即索引号有规律)的就用二维数组;索引号复杂的就用散列。

hash和二维数组的简单用法,参见:
简述perl的引用(包括标量、数组、hash等数据类型的引用) - 学而不思则罔,思而不学则殆 - 博客频道 - CSDN.NET
http://blog.csdn.net/u011729865/article/details/71308170

环境变量的传递

环境变量,在perl里就是散列类型。

%ENV
$ENV{'key'}="value";

但是该方法只能在该进程中有效,当退出该进程时,赋值将不会继续存在;同时其它进程也不会知道此次赋值。

文件

用open就挺方便;记着是三个参数就行,配合or die检查文件是否打开成功。
比如:

open my $FileXXX, "<","/home/XXX.dat" or die "Error: Cannot open this file";

while(<$FileXXX>){
  chomp($_);//根据下文,确认需要保留换行符。可选择删除换行符。有时候需要,有时候也不需要。
  .....
}

文件目录、文件名、路径的解析操作

用shell命令,就挺方便。
File::Basename

命令行参数

Getopt::Long模块是用于解析命令行参数的perl模块。
详情见:
http://blog.csdn.net/u011729865/article/details/59169766
例如:

#!/usr/bin/perl 
use strict; 
use warnings;
use Getopt::Long; 

my @libs    = ();  
my %flags   = ();  
my ( $verbose, $all, $more, $diam, $debug, $test, $step, $aa); 

GetOptions( 
        'verbose+'  => \$verbose, 
        'more!'     => \$more, 
        'debug:i'   => \$debug, 
        'lib=s'     => \@libs, 
        'flag=s'    => \%flags, 
        'test|t'    => \$test, 
        'all|everything|universe' => \$all, 
        'aa' => \$aa,
); 

调用shell命令

用反撇号`,返回值是内部print或者echo等形式产生的。
可以利用管道符|,或者| xargs -i echo {};强制产生返回值。

虽然调用非perl内置命令,会导致程序在不同系统(比如linux、windows)移植上出现问题。
但是,个人常用的perl脚本,只会应用到linux系统里。所以,个人更习惯使用shell、grep、sed、awk等命令结合的方式。这也是符合perl语言的定位,支持脚本实现采用“条条大道通罗马”方式。

变量的debug

可选Smart::Comment模块

主体结构的划分

  • 主程序划分为多个子程序
    1. 子程序的参数传递,尽量用散列来吸收;不要定义太多变量。这样方便理解,更方便perl -d做debug分析的时候,watch这个变量。例如:
sub configuration {
        my %options = @_;
        print "Maximum verbosity.\n" if $options{VERBOSE} == 9;
}

configuration(PASSWORD => 'xyzzy', VERBOSE => 9, SOCRE => 0);
  • 子程序以package方式调用,例如:

编写简单package的模板

包,一般起名叫packagename.pm

#!/usr/bin/perl
use strict;
use warnings;

package packagename
#require Exporter;
#our @ISA=qw(Exporter);
#our @EXPORT=qw(subname1 subname2 subname3 $varname1 $varname2);
#our @version=1.0;

sub subname1 {
.....
}

1;

说明:
1. 下述四行代码使用的话,在use packagename之后,函数调用而已不用指明packagename,即subname1()
2. 否则,在use packagename之后,函数调用需要用指明packagename,即packagename::subname1()

#require Exporter;
#our @ISA=qw(Exporter);
#our @EXPORT=qw(subname1 subname2 subname3 $varname1 $varname2);

然后,加载模板的目录,使之成为库的目录。,假设packagename.pm/my/dir目录里。

use lib '/my/dir';

脚本执行的关键信息保存在日志里

用open产生一个perl.log就挺方便。
Log::Log4perl

代码整理

perltidy命令。需要自行安装。帮助代码排版规范化。

参考文档:
《Perl高效编程》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

perl编写之前的一些习惯细节 的相关文章

  • 修改排序比较器内的字符串

    我有以下代码 在排序比较器中 它在进行比较之前删除前缀字符串 print for sort a s STRING b s STRING foo a cmp foo b a 尽管比较和顺序是正确的 但前缀字符串已从输出中删除 以下保留前缀字符
  • 我可以在 VIM 或 Perl 中替换单个正则表达式中的多个项目吗?

    假设我有字符串 The Quick Brown Fox Jumps Over the Lazy Dog 我可以用一个正则表达式将其更改为 The Slow Brown Fox Jumps Over the Energy Dog 吗 目前 我
  • 如何强制 Perl 按需重新编译使用“/o”编译的正则表达式?

    技术问题 给定一个正则表达式 my regEx qr whatever myVar oxi Notice o for compile once 强制重新编译的最有效方法是什么一经请求 例如 当我从程序逻辑中知道 myVar值改变 而不下降
  • Emacs cperl - 常量块中的缩进

    我正在运行基于 GNU Emacs 24 3 50 2 的 Aquamacs 3 0a cperl 版本是 6 2 当我编辑 Perl 常量块时 我得到了我不想要的额外缩进 use constant ONE gt 1 TWO gt 2 TH
  • 单台机器最快的 Perl IPC/消息队列是多少?

    我正在开发一个 主要 Perl 项目 并希望使用消息队列来相互隔离进程 我有这样的工作流程 输入 gt 接收器 gt 处理器 gt 输出 我需要每秒处理数百笔交易 所以速度是我最大的动力 对于这种类型的设置来说 最快的消息队列系统是什么 我
  • 无法在 Mac 上安装 DBD::mysql

    第一次发帖 格式可能不太对 请见谅 我一直在尝试使用 cpan 在 macOS Catalina 上安装 DBD mysql 但尚未成功 我使用了perlbrew 并尝试了mysql和mariaDB 但仍然没有成功 另外 我在网上研究了不同
  • 使用 unix ksh shell 脚本或 perl 脚本监视文件夹中的新文件并触发 perl 脚本

    我已经在谷歌搜索和溢出了一段时间 但找不到任何可用的东西 我需要一个脚本来监视公共文件夹并在创建新文件时触发 然后将文件移动到私有位置 我有一个 samba 共享文件夹 exam ple 在 UNIX 上映射到X 在窗户上 在某些操作中 t
  • 使用 Perl 写入文件的最简单方法是什么?

    目前我正在使用 system echo panel login panel password root name root pass port panel type gt gt home shared ftp 使用 Perl 做同样的事情最
  • perlbrew 可以在 Windows 上运行吗?

    使用 ActiveState 5 8 8Windows XP http en wikipedia org wiki Windows XP 我想安装更新的 Perl 进行测试 迁移 有一天 我们将不再以为自己只能使用一台计算机 当我想测试这类
  • Perl 构建、单元测试、代码覆盖率:一个完整​​的工作示例

    我找到的关于 Perl 构建过程 单元测试和代码覆盖率的大多数 Stackoverflow 答案都只是将我指向 CPAN 那里的文档 指向 CPAN 模块绝对没有任何问题 因为完整的文档应该位于此处 不过 在很多情况下 我很难找到完整的工作
  • 匹配有限自然数列

    我怎样才能匹配有限自然数 http en wikipedia org wiki Natural number正则表达式系列 所以 要求是 字符串包含数字和空格 作为分隔符 第一个数字是1 每个数字 第一个数字除外 等于前一个数字 1 应该是
  • Perl LWP::简单 HTTPS 错误

    我正在尝试获取网站的内容并打印 该代码按照我希望的方式在常规 HTTP 网站上运行 但它不适用于 HTTPS 我已经查找了此问题的修复程序 但它们在我的程序中不起作用 这是我目前拥有的代码 usr bin perl use strict u
  • Perl Moose TypeDecorator 错误。我该如何调试?

    我最近遇到了一个问题 非常感谢您的见解 我在圣诞节前在 PerlMonks 上发布了类似的问题 并提供了一些从 MooseX Declare 切换的反馈 http www perlmonks org node id 877703 1 我现在
  • Perl 删除目录中的所有文件

    我怎样才能删除allPerl 中目录中的文件 不删除目录 我的主机只允许最多 250 000 个 文件 而我的 tmp 文件夹会在所有会话 cookie 运行的情况下快速填充 250 000 个 qouta 在这种情况下我无法删除 tmp
  • 如何在没有循环的情况下初始化哈希中的值?

    我正在尝试找出一种无需经过循环即可初始化哈希的方法 我希望使用切片来实现这一点 但它似乎没有产生预期的结果 考虑以下代码 usr bin perl use Data Dumper my hash hash currency symbol B
  • 如何在正则表达式中匹配“/*”?

    stuff d learning perl tmp txt open STUFF stuff or die Cannot open stuff for read while
  • Perl 中的布尔函数应该返回什么值?

    简短的问题 在 Perl 代码库中一致表示真假的最佳方法是什么 1 0 1 Perl 原生布尔运算符的特殊空字符串 return undef 即空列表 问题背景 我们都知道 Perl 在布尔值方面非常灵活 就像大多数事情一样 例如 Perl
  • 在压缩存档内的文本文件上运行“head”,而不解压存档

    问候 我接手了之前的团队并编写了处理 csv 文件的 ETL 作业 我在 ubuntu 上结合使用 shell 脚本和 perl csv 文件很大 它们以压缩档案形式到达 解压后 很多都超过 30Gb 是的 那是 G 旧进程是在 cron
  • Perl 中可以使用哪种语法糖来减少左/右值运算符与 if 语句的代码?

    那里有很多语句 因为 Perl 是一种非常甜蜜的语言 但任何语言中最常用的语句都是 if 语句和设置值的组合 我想我已经找到了很多 但仍然存在一些空白 最终 目标是不必多次编写变量名 这是我到目前为止所拥有的 r s r s unless
  • unix df 上的正则表达式帮助

    我需要一些帮助来调整我的代码以查找此 UNIX 中的另一个属性df output Ex Filesystem Size Used Avail Capacity Mounted on dev ad4s1e 61G 46G 9 7G 83 ho

随机推荐

  • asp.net zero 8.2 学习-3-添加实体,并迁移到数据库

    系列目录 asp net zero 8 2 学习 1 安装 asp net zero 8 2 学习 2 创建一个页面 asp net zero 8 2 学习 3 添加实体 并迁移到数据库 asp net zero 8 2 学习 4 创建接口
  • 压缩伪影的探讨

    1 压缩伪影的由来 常用的视频编码器中 在一个框架中使用了多种编码方法 01 预测编码 不编码预测值 而是编码预测值与实际值的差值 02 变换编码 对信号的样本值进行某种形式的函数变换 从一种空间变换到另一种空间 然后再根据信号在另一个空间
  • SOA中国路线图活动感受

    下午参加了SOA中国路线图活动 主要由普元公司和相关的媒体以及电信客户进行演讲 对于SOA我之前一直认为是个很虚的东西 概念大于实践 但听了普元公司黄柳青博士的介绍以及在电信领域中的应用 感觉还是有收获的 很多思想可以应用到系统的设计和开发
  • 数据结构——红黑树

    1 什么是红黑树 红黑树是一种特定类型的二叉树 用于组织数据 它是一种平衡二叉查找树 AVL树 的变体 每个结点都带有颜色属性 红色或黑色 在红黑树中 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长 具体来说 红黑树满足以下性质 每
  • 结构型模式-享元模式

    package per mjn pattern flyweight 抽象享元角色 public abstract class AbstractBox 获取图形的方法 内部状态 public abstract String getShape
  • 机器学习 可视化_机器学习-可视化

    机器学习 可视化 机器学习导论 Introduction to machine learning In the traditional hard coded approach we program a computer to perform
  • 【Unity 几何着色器】简单的网格线描边

    水文 几何着色器 第一个pass就默认的unlit效果 第二个pass是新建的 属性都没有用到 先留个坑吧 Shader GeoHelp LineMesh Properties MainTex Texture 2D white EdgeWi
  • 优质数对的数目[位运算特点+抽象能力考察+分组快速统计]

    位运算特点 抽象能力考察 分组快速统计 前言 一 优质数对的数目 二 思路与优化过程 总结 参考文献 前言 位运算是计算机最基本的计算 是最快的运算方式 与或非各有特点 抽象能力考察我理解成一种 拿核心去累赘 的能力 分组快速统计 我们不必
  • 1Python入门小结(1)

    Python入门小结 1 万丈高楼平地起 简介 Python是一种通用编程语言 其在科学计算和机器学习领域具有广泛的应用 本小节包含的内容 变量 运算符与数据类型 位运算 条件语句 循环语句 异常处理 变量 运算符与数据类型 注释 Pyth
  • 我使用过的Linux命令之stty - 显示和修改终端行设置

    原文链接 http codingstandards iteye com blog 826924 用途说明 stty命令用于显示和修改终端行设置 change and print terminal line settings 常用参数 stt
  • 【Linux学习】虚拟机VMware 安装Qt5 一条龙讲解

    如何在Linux下安装Qt5呢 若已在Linux下载好安装包 可直接从第三步进行阅读 目录 第一步 下载所需版本Qt 第二步 将Qt安装包传输到Linux 第三步 Linux下安装Qt 第四步 配置 Qt 环境 本文安装版本 linux上的
  • 浅谈软件构件和软件构件测试

    什么是构件 构件也称为组件 是一个独立发布的功能部分 通过接口可以访问它的服务 其特点是 l 软件系统中具有相对独立功能 可以明确辨识 接口由契约指定 和语境有明显依赖关系 可独立部署 且多由第三方提供的可组装软件实体 l 软件构件须承载有
  • 前端导出后端文件的方法

    一般存在两种方式 1 请求接口之后 后端返回文件路径 前端直接下载 2 请求接口之后 后端以文件流的形式返回给前端 前端再下载到本地 第一种方式 window location href res request responseURL 直接
  • CVPR 2017论文

    近期在看CVPR2017的文章 顺便就把CVPR2017整理一下 分享给大家 更多的 Computer Vision的文章可以访问Computer Vision Foundation open access CVPapers Machine
  • Vue实现给按钮的点击事件绑定id参数

    当我们需要给按钮所绑定的值做出判断并记录时 eg 为答题的正确以及题号做判断 第一种情况 使用v for循环 div div 我是id div div 1 2 3 然后在 vue 的实例中就可以拿到对应的 id b index this l
  • 持久化数据&缓存数据双写一致性

    背景 缓存中数据更新一般有两个入口 数据缓存过期 数据在访问时发现缓存中无数据时重新查库然后更新至缓存 场景和问题等同于缓存查询 相关solution参考 缓存数据查询的注意事项 缓存未过期 数据库数据有变动主动更新至缓存 比较常见的场景
  • Windows+Ubuntu 22.04.1 LTS 64bit 双系统配置

    为了开发linux下的软件 花了半天的时间安装了双系统 记录一下过程方便以后重装 帮同学装 安装尽量使用官网教程 一 提前准备 1 确保硬盘有足够空余空间 2 关闭windows快速启动 会影响开机进入多系统引导 windows 10如何关
  • 函数栈帧的创建与销毁

    目录 引言 基础知识 内存模型 寄存器的种类与功能 常用的汇编指令 函数栈帧创建与销毁 main 函数栈帧的创建 NO1 NO2 NO3 NO4 NO5 NO6 main 函数栈帧变量的创建 调用Add 函数栈帧的预备工作 传参 NO1 N
  • 小蜜团队万字长文《读后简略概括》

    1 对话系统主要分为三类 闲聊型 任务导向型 问答型 闲聊型 就是瞎聊 想聊啥就 聊啥 任务导向型 考虑多轮对话 根据对话的不同状态和槽位值进行回复策略的选择 问答型 一问一答 识别询问者的意图 从知识库中选取答案进行返回 2 任务导向型
  • perl编写之前的一些习惯细节

    变量 环境变量的传递 文件 文件目录文件名路径的解析操作 命令行参数 调用shell命令 变量的debug 主体结构的划分 编写简单package的模板 脚本执行的关键信息保存在日志里 代码整理 下述信息 仅供自己编写新脚本之前的回顾内容