Perl:命令行参数的处理

相关阅读

Perl:正则表达式

Perl:什么是其特有的autovivafacation性质?

Perl:匿名数组嵌套的解引用相关问题


        命令行参数是shell和perl交互的一个重要媒介,本文介绍了如何在Perl中对命令行参数进行处理。

        首先我们给出所有的源程序,再分别对其中的各个子例程进行讲解。

sub print_and_exit {print @_, "\n";exit 1;
} # print_and_exitsub read_argv {my ($aref, $hv) = @_;my ($opt);for my $arg ( @$aref ) {if ( $arg =~ /^-/ ) {$opt = $arg;if ( exists $hv->{$opt} ) {print_and_exit( "Repeated option: $arg" );}else {@{ $hv->{$opt} } = ();}}elsif ( defined $opt ) {$arg =~ s/^\s*// ;push @{ $hv->{$opt} }, $arg;}else {print_and_exit( "Un-support option: $arg" );}}
} # read_argvsub check_argv_perl_type {my ($hr, $hv) = @_;for my $opt ( keys %$hv ) {if ( exists $hr->{$opt} ) {if ( ${$hr->{$opt}}{'perl_type'} eq 'scalar') {if ( @{ $hv->{$opt} } != 1 ) {print_and_exit( "Error: only one parameter is expected to '$opt'" );} }elsif ( ${$hr->{$opt}}{'perl_type'} eq 'array') {if ( @{ $hv->{$opt} } < 1 ) {print_and_exit( "Error: one or more parameter is expected to '$opt'" );}}else {print_and_exit( "Error: unknown 'perl_type' of '$opt'" );}}else {print_and_exit( "Un-support option: '$opt'" );}}
} # check_argv_perl_typesub check_argv_data_type {my ($hr, $hv) = @_;for my $opt ( keys %$hv ) {if ( exists $hr->{$opt} ) {next unless exists $hr->{$opt}{'data_type'};if ( $hr->{$opt}{'data_type'} eq 'inputfile') {for my $arg ( @{ $hv->{$opt} } ) {if ( ! ( (-f $arg) and (-s $arg) ) ) {print_and_exit( "Error: input file is expected to '$opt': $arg" );}}}elsif ( $hr->{$opt}{'data_type'} eq 'num') {for my $arg ( @{ $hv->{$opt} } ) {unless (     ( $arg =~ /^-?\d+$/ )or ( $arg =~ /^-?\d+\.\d+$/ )or ( $arg =~ /^-?\d+[eE]-?\d+$/ )or ( $arg =~ /^-?\d+\.\d+[eE]-?\d+$/ )) {print_and_exit( "Error: number is expected to '$opt': $arg" );}}}elsif ( $hr->{$opt}{'data_type'} eq 'inputdir') {for my $arg ( @{ $hv->{$opt} } ) {if ( ! -d $arg ) {print_and_exit( "Error: directory is expected to '$opt': $arg" );}}}}else {print_and_exit( "Un-support option: '$opt'" );}}
} # check_argv_data_typesub get_default {my ($hr, $hv) = @_;for my $opt ( keys %$hr ) {next if exists $hv->{$opt} ;if ( exists $hr->{$opt}{'default'} ) {### 'default' => "some_scalar", OR 'default' => ["some", "element", "of", "array"],$hv->{$opt} = $hr->{$opt}{'default'}; }else {print_and_exit( "Error: no input or default for '$opt'" );}}} # get_defaultsub combine_scalar {my ($hr, $hv) = @_;for my $opt ( keys %$hv ) {if ( ${$hr->{$opt}}{'perl_type'} eq 'scalar') {$hv->{$opt} = $hv->{$opt}->[0];}}} # combine_scalarsub Handle_argv {my ($aref, $hr, $hv) = @_;read_argv($aref, $hv);check_argv_perl_type($hr, $hv);check_argv_data_type($hr, $hv);get_default($hr, $hv);combine_scalar($hr, $hv);
} # Handle_argvsub print_argv {my ($hv) = @_;for my $opt ( keys %$hv ) {print "$opt =>";for my $pv ( @{ $hv->{$opt} } ) {print " $pv";}print "\n";}
} # print_argvmy %rule_of_opt = ('-s' => {'perl_type' => 'scalar','data_type' => 'inputfile',},'-a' => {'perl_type' => 'array','data_type' => 'num','default'   => '5'}
);
my (%value_of_opt) ;
Handle_argv( \@ARGV, \%rule_of_opt, \%value_of_opt );
print_argv( \%value_of_opt );exit 0;

1、print_and_exit

       该子例程用于根据参数打印信息并使用exit退出程序。

2、read_argv

     该子例程用于将命令行参数读进参数散列中。参数散列的键为命令行参数中各个选项,如"-s"和"-a",值为命令行参数中跟在该选项后的参数,在这里,规定属于一个选项的参数是该选项后至下一个选项间的参数,且选项不能重复,否则会报错"Repeated option",因为属于一个选项的参数可能有多个,需要用数组保存,所以使用$hv->{$opt}保存了一个指向数组的引用(注意,Perl中数组的值和散列的值必须是标量(scalar))。使用push将选项的参数值加入该选项对应值(数组引用)指向的数组中。

3、check_argv_perl_type

      该子例程用于检查read_argv所读取的散列中,每个选项的参数数量是否符合散列%rule_of_opt所定义的规则,在代码中,"-s"选项的"perl_type"属性为标量,而"-a"选项的"perl_type"属性为数组。如果不符合,则程序会报错提示参数数量有问题,并退出。

4、check_argv_data_type

      该子例程用于检查read_argv所读取的散列中,每个选项的参数类型是否符合散列%rule_of_opt所定义的规则,在代码中,"-s"选项的"data_type"属性为输入文件,而"-a"选项的"perl_type"属性为数字。如果不符合,则程序会报错提示参数类型有问题,并退出。代码中使用了正则表达式对数字进行识别,使用文件操作符-f和-d分别对文件和目录进行识别(有关Perl中正则表达式的内容,可以看Perl:正则表达式)。

5、get_default

      该子例程用于在未指定选项时,为其创建默认参数值,默认值可以根据规则是标量或数组,如果一个选项没有出现,且没有默认值,则会报错。

6、combine_scalar

      该子例程用于对只有一个参数的选项进行优化,会直接使用$hv->{$opt}保存该参数值,而不是保存指向数组的引用。

7、Handle_argv

       这是将子例程整合封装的例程,注意各子例程的调用顺序。

8、print_argv

       该子例程可以打印经过处理后的选项参数散列,用于观察结果。

源代码来源于《Pelr语言IC设计实践》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

esp32_arduino的开发库安装笔记

1.1 Arduino软件下载与安装 Arduino官网下载地址&#xff1a;https://www.arduino.cc/en/software。 1.2在线安装 选择文件 - 首选项。 在附加开发板管理器网址中添加以下链接中的一个。 (1)Stable release link: https://raw.githubusercontent.com/espressif/arduino-es…

【Linux后端服务器开发】MAC地址与其他重要协议

目录 一、以太网 二、MAC地址 三、MTU 四、ARP协议 五、DNS系统 六、ICMP协议 七、NAT技术 八、代理服务器 一、以太网 “以太网”不是一种具体的网路&#xff0c;而是一种技术标准&#xff1a;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容&#xf…

【STM32MP1系列】DDR内存测试用例

DDRDDR内存测试 一、uboot下测试DDR内存二、Linux内核下测试DDR内存1、使用memtester测试DDR内存2、使用stressapptest测试DDR内存三、Buildroot中构建memtester软件包四、搭建stressapptest软件包五、注意事项一、uboot下测试DDR内存 输入bdinfo查看DDR起始地址以及大小: b…

【ARM Coresight 系列文章 10.3 - ARM Coresight STM 寄存器介绍 及STM DMA 传输介绍】

文章目录 STM Register summarySTM DMA 相关的寄存器DMA TransferBurst requestSingle and burst request STM Register summary STM 的寄存器主要可以分为以下几类&#xff1a; STM DMA 相关的&#xff1b;STM HW Trigger 相关的&#xff1b;系统控制及状态寄存器&#xff1…

Linux系统中的SQL语句

本节主要学习&#xff0c;SQL语句的语句类型&#xff0c;数据库操作&#xff0c;数据表操作&#xff0c;和数据操作等。 文章目录 一、SQL语句类型 DDL DML DCL DQL 二、数据库操作 1.查看 2.创建 默认字符集 指定字符集 3.进入 4.删除 5.更改 库名称 字符集 6…

用python通过http实现文件传输,分为发送端和接收端

要使用Python通过HTTP实现文件传输&#xff0c;可以使用Python的 requests 库来发送和接收HTTP请求。以下是一个示例代码&#xff0c;其中包括发送端和接收端的实现。 发送端&#xff1a; import requestsdef send_file(file_path, url):with open(file_path, rb) as file:re…

Safetensors,高效安全易用的深度学习新工具

大家好&#xff0c;本文将介绍一种为深度学习应用提供速度、效率、跨平台兼容性、用户友好性和安全性的新工具。 Safetensors简介 Hugging Face开发了一种名为Safetensors的新序列化格式&#xff0c;旨在简化和精简大型复杂张量的存储和加载。张量是深度学习中使用的主要数据…

Cypress 上传 pdf 变空白页问题

在使用cypress 上传文件时&#xff0c;上传正常&#xff0c;但是&#xff0c;pdf一直空白的&#xff0c;翻边了资料也没找到原因。最后在一个不起眼的地方发现了问题所在。 错误的代码&#xff1a; cy.fixture(CBKS.pdf).as(uploadFile)cy.get(.el-upload-dragger).selectFile…

借助 Mybatis 的动态 SQL 解决传参不确定问题

在上一篇的&#xff1a;Mybatis 操作数据库的基本 CRUD 以及查询操作详析_糊糊涂涂的博客-CSDN博客中介绍了Mybatis使用固定SQL语句操作数据&#xff0c;本篇介绍 Mybatis 一个强大的特性&#xff1a;动态SQL。 动态 SQL 解决什么问题&#xff1f; 那当我们要执行的业务逻辑有…

【Nodejs】Node.js开发环境安装

1.版本介绍 在命令窗口中输入 node -v 可以查看版本 0.x 完全不技术 ES64.x 部分支持 ES6 特性5.x 部分支持ES6特性&#xff08;比4.x多些&#xff09;&#xff0c;属于过渡产品&#xff0c;现在来说应该没有什么理由去用这个了6.x 支持98%的 ES6 特性8.x 支持 ES6 特性 2.No…

vue3如何封装接口

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;如何封装接口 目录 前言 1.首先&#xff0c;安装并导入axios库。你可以使用npm或yarn来安装&#xff1a; 2.创建一个api.js文件来管理接口封装&#xff1a; 3.在Vue组件中使用封装的接口&#xff1…

Andrid进阶之回调方法

回调在android开发中必不可少&#xff0c;也是比较常见的&#xff0c;比如控件的点击事件&#xff0c;我们自定义回调基本就是在创建一个方法的时候能够及时拿到对应的信息 Kotlin写法&#xff1a; private var mOnListener: OnMListener? nullinterface OnMListener {fun g…

LeetCode 每日一题 2023/7/24-2023/7/30

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 7/24 771. 宝石与石头7/25 2208. 将数组和减半的最少操作次数7/26 2569. 更新数组后处理求和查询7/27 2500. 删除每行中的最大值7/28 2050. 并行课程 III7/29 141. 环形链表…

安装Python之后 安装库报错 There was an error checking the latest version of pip.

报错代码 & 图片如下 Looking in indexes: https://pypi.tuna.tsicmdnghua.edu.cn/simple WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HT…

Ubuntu 曝Linux漏洞,近 40% 用户受影响

Bleeping Computer 网站披露&#xff0c;Wiz 研究人员 s.Tzadik 和 s.Tamari 发现 Ubuntu 内核中存在两个 Linux 漏洞 CVE-2023-32629 和 CVE-2023-2640&#xff0c;没有特权的本地用户可能利用其在设备上获得更高权限&#xff0c;影响大约 40% 的 Ubuntu 用户。 Ubuntu 是目前…

双重for循环优化

项目中有段代码逻辑是个双重for循环&#xff0c;发现数据量大的时候&#xff0c;直接导致数据接口响应超时&#xff0c;这里记录下不断优化的过程&#xff0c;算是抛砖引玉吧~ Talk is cheap,show me your code&#xff01; 双重for循环优化 1、数据准备2、原始双重for循环3、…

【设计模式——学习笔记】23种设计模式——组合模式Composite(原理讲解+应用场景介绍+案例介绍+Java代码实现)

案例引入 学校院系展示 编写程序展示一个学校院系结构: 需求是这样&#xff0c;要在一个页面中展示出学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一个学院有多个系 【传统方式】 将学院看做是学校的子类&#xff0c;系是学院的子类&#xff0c;小的组织继承大…

K8s使用Ceph作为后端存储

Ceph概述 部署Ceph集群 Ceph存储使用 Pod使用Ceph持久化数据 Ceph监控 Rook部署Ceph 1❖ Ceph概述 Ceph介绍 Ceph架构 Ceph核心概念 Ceph介绍 Ceph是一个开源的分布式存储系统&#xff0c;具有高扩展性、高性能、高可靠性等特点&#xff0c;提 供良好的性能、可靠性和可扩展…

ROS与STM32通信-rosserial

文章目录 硬件接线 软件STM32CubeMX配置 rosserial移植上位机订阅-下位机发布上位机订阅下位机发布通信 上位机发布-下位机订阅上位机发布下位机订阅通信 硬件 STM32F103c8t6OLED(I2C)USB2TTLStlink 接线 OLED(GPIO模拟I2C) 硬件引脚OLEDSCLPA4OLEDSDAPA5 USART1 硬件引脚…

CSS3 Flexbox

Flex 是 Flexible Box 的缩写&#xff0c;意为弹性盒子布局。 CSS3中一种新的布局模式&#xff1a;W3C在2009年提出的一种布局方案&#xff0c;一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。其目的是提供一种更加有效的方式来对一个容器…