linux上perl怎么传输参数,如何在perl子函数中传递参数?

826bf389492c4340d529373b4d2b34bc.png

慕村225694

Perl 可以通过函数元型在编译期进行有限的参数类型检验。如果你声明sub mypush (+@)那么 mypush() 对参数的处理就同内置的 push() 完全一样了。函数声明必须要在编译相应函数调用之前告知编译器(编译器在编译函数调用时会对相应函数用 prototype来查询它的元型来进行参数检验,并决定怎样编译此函数调用)。元型只在不用 & 调用函数的时候起作用。就是说在语法上如果你想像内置函数一样调用,它就表现的像内置函数一样。如果想用过时的风格通过 & 调用,那么编译器就无视函数声明。另外元型在函数引用如 \&foo 和间接调用如 &{$subref} 和 $subref->() 时也不起作用。方法调用也不受元型影响,因为实际调用的函数无法在编译期决定,它是由继承关系决定的。因为这个特性最初的目的是使你可以像内置函数那样调用自己的函数,所以下面就给出等价于内置函数调用方式的函数元型。声明为 调用方式sub mylink ($$) mylink $old, $newsub myvec ($$$) myvec $var, $offset, 1sub myindex ($$;$) myindex &getstring, "substr"sub mysyswrite ($$$;$) mysyswrite $buf, 0, length($buf) - $off, $offsub myreverse (@) myreverse $a, $b, $csub myjoin ($@) myjoin ':', $a, $b, $csub mypop (+) mypop @arraysub mysplice (+$$@) mysplice @array, 0, 2, @pushmesub mykeys (+) mykeys %{$hashref}sub myopen (*;$) myopen HANDLE, $namesub mypipe (**) mypipe READHANDLE, WRITEHANDLEsub mygrep (&@) mygrep { /foo/ } $a, $b, $csub myrand (;$) myrand 42sub mytime () mytime任何 \ 跟着的函数元型中的字符代表着实际的参数必须由相应字符开头(参数前可跟my our local 声明),只有 $ 例外,它可以接收并不以 $ 开头的 hash 和数组的元素,比如 my_function()->[0]。传给 @_ 的参数将会是相应实际参数的引用,即对它加 \。你可以用 \[] 来表示多个可用的类型。比如:sub myref (\[$@%&*])上面的函数声明允许像下面这样调用 myref() 这个函数myref $varmyref @arraymyref %hashmyref &submyref *glob传入函数 myref 的第一个参数将分别是一个 scalar、数组、hash、函数、glob 的引用。函数元型中前面不跟 \ 的字符有特殊意义。任何不跟 \ 的 @ % 将代表剩下的所有参数,并提供 list context。而 $ 将提供 scalar context。 & 表示需要一个匿名函数(即sub { } 这样的结构,不能是变量),当用作第一个参数时可以省掉 sub 关键字(如果省掉 sub 则后面跟的逗号也必须要省掉).* 表明可以接收一个 bareword、常量、scalar 表达式、typeglob或 typeglob 的引用。传入函数的参数要么是一个简单的 scalar 要么是 typeglob 的引用(后两种情况)。如果你总是想要一个 typeglob 的引用可以用 Symbol::qualify_to_ref() 将名字转换成相应的 typeglob 的引用:use symbol 'qualify_to_ref';sub foo (*) {my $fh = qualify_to_ref(shift, caller);...}+ 类似于 $ 但是当遇到数组变量或 hash 变量时表示 \[@%],在其它情况下总是提供scalar context。它适用于可以接收数组变量或数组引用为参数的函数:sub mypush (+@) { # 5.14 中 push 第一个参数可以为数组的引用my $aref = shift;die "Not an arrayref" unless ref $aref eq 'ARRAY';push @$aref, @_;}当用 + 时函数必须要检验实际的参数是否是自己需要的类型,因为它不区分 @ %。分号 ; 用来分隔必须的参数和可选的参数。它必须在 @ % 之前,因为它们代表剩下的所有参数。在元型最后或在 ; 之前可以用 _ 来代替 $:它表示如果没有提供这个参数会传递 $_作为对应的参数,它可以用来实现默认参数的语法。注意上面列表最后3个例子,mygrep() 表现的就像列表操作符,myrand() 表现的就像rand() 一样为一元操作符,mytime() 就像 time() 一样完全不需要参数。如果你这么用:mytime + 2;你将会得到 mytime() + 2,而不是 mytime(2),没有函数元型根本无法实现这样的效果。有意思的是你可以把 & 用在最开始的位置来创造新语法:sub try (&@) {my ($try, $catch) = @_;eval { &$try };if ($@) {local $_ = $@;&$catch;}}sub catch (&) { $_[0] }try {die "phooey";} catch {/phooey/ and print "unphooey\n";};上面的代码会打印 "unphooey",即是 Try::Tiny 的实现方法。(当然用 &$catch 会将 @_ 暴露给 $catch 但这里并不是我们要考虑的)。让我们重新实现下 Perl 的 grep 操作符:sub mygrep (&@) { # 无法实现 grep EXPR,LIST 这个语法my $code = shift;my @result;foreach $_ (@_) {push @result, $_ if &$code;}@result;}请不在要函数元型中使用字母或数字,它们被保留作它用,或许在将来用于实现完整的参数列表。不要为老的代码添加上函数元型,因为有时会改变语意出来奇怪的结果。比如:sub func ($) {my $n = shift;print "you ave me $n\n";}某人在代码中这么调用它:func(@foo);func(split /:/);只是声明了函数 func 只接收一个 scalar 参数却带来了灾难性的结果,原来参数所处的list context 被改为 scalar context,传入的参数变成 @foo 的元素个数,和分割的元素个数。

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

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

相关文章

Struts2中ValueStack结构和总结

【ValueStack和ActionContext的关系】首先,从结构上来看ValueStack是ActionContext的一个组成部分,是对ActionContext功能的扩展。ActionContext是一个容器结构,是Struts2中用于数据存储的的场所,而ValueStack则是一个具备表达式引…

浅谈mysql数据库引擎

2019独角兽企业重金招聘Python工程师标准>>> 数据库是数据的集合,计算机中的数据库是存储器上一些文件的集合或者是内存数据的集合。Mysql,SQL server数据库都是可以存储数据,并提供数据查询,更新功能的数据库管理系统。Mysql数据…

linux ssh抓包,如何在SSH连接Linux系统的环境下使用wireshark抓包?

TSINGSEE青犀视频云边端架构EasyNVR、EasyDSS、EasyGBS等都是有两种操作系统的版本,一种是linux,一种是windows。而大多数开发者用户都会使用linux版本进行安装。对于安装部署出现的问题,TSINGSEE青犀视频团队研发的经常为客户远程调试&#…

ASP.NET后台调用前台JS函数的三种常见方法

为什么80%的码农都做不了架构师?>>> 第一种:使用普通的添加控件中的Attributes属性进行调用 例如,像一般的普通的按钮:Button1.Attributes.Add("onclick","MyFun();"); 此方法只能在Onload中或者…

嵌入式数据库sqlite在ARM上的的移植和使用

参考SQLite的编译、安装和使用_whz_zb的博客-CSDN博客,如有侵权,请告知删除。 参考:头文件路径问题 Linux下的头文件搜索路径 - 心哲 - 博客园 参考:进一步学习资源 SQlite - 标签 - likebeta - 博客园 一、源码获取 SQLite Do…

贪心法

贪心法的证明 —归纳证明: —贪心法使用的条件是:最优子结构和贪心选择正确性 —贪心算法是一步一步实现的, —在归纳证明的时候,贪心的第一步贪心选择策略的正确性就是归纳基础,因为以后都是一个子问题的选取&#xf…

第一季5:Hi3518EV200的环境搭建

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、内容总结 本文讲述如何安装交叉编译工具链,与编译源码得到uboot、kernel、rootfs镜像文件。 (1)安装交叉编译工具链,主要是通过执行osdrv/opensou…

Android动画的实现 上

在Android系统中也能经常见到动画,那么如何实现动画效果呢?本文就来为大家介绍动画的实现方式。 Android中动画的实现分两种方式,一种方式是补间动画Tween Animation,就是说你定义一个开始和结束,中间的部分由程序运算…

第一季2:HI3518EV200的初体验(检测板子是否正常工作)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、检测步骤 1、设置PC主机有线网卡的ip地址设为192.168.1.10,关闭防火墙。 2、虚拟机桥接到有线网卡,并设置虚拟机的静态ip地址为192.168.1.141。 3、在uboot控制台设置ub…

第一季3:HI3518E方案整体架构介绍(硬件和软件支持)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 1、硬件资源 (1)HI3518E单芯片提供:CPU DSP 内置64MB DDR ETHERNET MAC。 (2)外置16MB的SPI接口的Flash用来存放程序(ubo…

(一)FlexViewer之整体框架解析

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.FlexViewer简介 FlexViewer框架为Esri提供的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架。目前有两种版本,一种…

三阶魔方复原操作方法

在女票的指导下,我花了一个晚上学习如何复原三阶魔方,虽然是知其然不知其所以然,但好歹也能把魔方复原了。下面都是一些傻瓜式的操作,里面涉及的理论我不清楚。魔方总共分三层,下面是每层复原方法。 第一层 1、先以“…

Phaser开源2d引擎 javascript/html5游戏框架

功能特点(Features) 易维护代码(Easy Asset Loading) Phaser可以加载图片,音频文件,数据文件,文本文件和自动解析精灵图和纹理地图集数据(出口纹理封隔器或Flash CS6&#xf…

8大排序算法图文讲解转

本文链接:http://www.cricode.com/3212.html 作者:快课网——Jay13 转载请务必保留作者出处,谢谢! 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大…

Immutable Collections(3)Immutable List实现原理(中)变化中的不变

Immutable Collections(3)Immutable List实现原理(中)变化中的不变 文/玄魂 前言 在上一篇文章&#xff08;Immutable Collections&#xff08;2&#xff09;ImmutableList<T>实现原理.&#xff08;上&#xff09;&#xff09;,分析了&#xff09;ImmutableList<T>…

大话Fragment管理

大话Fragment管理 上一个项目遇到了一个Activity 管理30个Fragment的情况&#xff0c;刚开始的时候真的管理的焦头烂额&#xff0c;但是后来不停的研究api文档&#xff0c;渐渐的明白了android的Fragment管理 体系。下面用…

第一季4:Hi3518E_SDK_Vx.x.x.x的SDK目录结构

一、Hi3518E_SDK_V1.0.3.0.tgz的位置 “Hi3518E_SDK_V1.0.3.0.tgz”位于“Hi3518E V200R001C01SPC030”中&#xff0c;其目录包含关系如下。 Hi3518E_SDK_V1.0.3.0.tgz 解压后内部文件组织如下。 二、执行SDK展开脚本sdk.unpack后的目录关系 将Hi3518E_SDK_V1.0.3.0.tgz拷贝到…

第一季6:海思方案中uboot、kernel和rootfs的烧写方法

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、概述 因为所用的板子默认从SPI Flash启动&#xff0c;因此本文主要讲如何“使用tftp&#xff0c;烧写映像文件&#xff08;uboot、kernel、rootfs&#xff09;到SPI Flash”。另外海思还提供了“…

Java Web笔记之Struts2.1 +Hibernate3.3 +Spring3.0

2019独角兽企业重金招聘Python工程师标准>>> 1、Struts2 1.1、了解Struts2 Struts2是基于MVC设计模式的Java Web框架技术之一&#xff0c;按照MVC设计思想把Java Web应用程序分为&#xff1a; 控制器层&#xff0c;包括核心控制器FilterDispatcher和业务控制器Actio…

高地址和低地址、高字节与低字节、大小端模式的转换、存储顺序

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、高地址和低地址 二、高字节低字节 如int a16777220&#xff0c;化为十六进制是0x01 00 00 04&#xff0c;则04属于低字节&#xff0c;01属于高字节。 三、大小端模式 &#xff08;1&#xff09;如果a在内…