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,一经查实,立即删除!

相关文章

Android中级之网络数据解析一之Json解析

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在网络传输的时候,经常用到的解析方式有xml和json两种,今天我们主要来说下json、解析,以及其要点。 首先json格式: “[”标识json解析开始…

Struts2中ValueStack结构和总结

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

将USB-WiFi网卡移植到X210开发板

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、移植前的准备工作 1、搭建开发环境 (1)虚拟机运行着ubuntu14.04系统。 (2)X210开发板运行着linux内核镜像、QT4.8文件系统镜像。相关的镜像文件在…

文件读取ini文件另一种读取办法

时间紧张,先记一笔,后续优化与完善。 Windows下的ini文件的读取可以应用系统提供的api来实现 GetPrivateProfileString GetPrivateProfileInt ... 现实应用中, 如果不应用一种同一的方法来包装一下会让源代码看起来很乱。 所以,须要计划一个便利&#xf…

浅谈mysql数据库引擎

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

网络摄像机简介

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 一、网络摄像机定义 (1)网络摄像机,也叫IP摄像机,即IPCamera,简称IPC,近几年得益于网络带宽,芯片技术,算法技术…

如今的移动操作系统,写在2013年——android篇 by 伊一线天

前奏: 曾在2011年,我写过一篇同样题材的文章。时隔2年后,如今的移动操作系统领域跌宕起伏,2年前的一些系统变得更加强大,一些已经昙花一现。现在让我再来总结一些2013年移动操作系统。 第一讲:android 自从…

linux qt ping,Qt5.2中使用ping命令实现Ip扫描功能

在实现类似于Free IP Scanner 2.1的Ip扫描器软件中,会用到ping命令。如果使用Qt编程实现,主要会用QThread、QProcess这两个类。关于这两个类的具体用法可以查阅Qt助手或者QT官网。在QT中为了扫描大量的Ip,通常需要将扫描Ip的任务放在一个单独…

Python安装模块出错(ImportError: No module named setuptools)解决方法

原地址:http://www.cnblogs.com/BeginMan/archive/2013/05/28/3104928.html 在window平台下安装第三方模块时,出现这样的错误: Google了以下,才知道原来Python里少了这个模块。 我们可以在Python官网去查找 其中 Package Index中查…

kali linux 2.0 ssh,Kali 2.0使用SSH进行远程登录(示例代码)

一、配置SSH参数修改sshd_config文件,命令为:vim /etc/ssh/sshd_config将#PasswordAuthentication no的注释去掉,并且将NO修改为YES //kali中默认是yes将PermitRootLogin without-password修改为PermitRootLogin yes二、启动SSH服务命令为&am…

数据库课程设计报告

课程设计报告内容 封面(注明组员及分工) 目录 1.系统概述 – 系统的特点 – 系统设计环境 2.系统需求分析 – 系统设计的目标 – 系统需求分析(给出:数据流图、数据字典) – 系统功能…

基于Hi3516A的H265 IPC LIVE555 开发

转载于http://m.blog.csdn.net/faihung/article/details/73008742,如有侵权请告知删除。 1 系统工作原理 系统以Hi3516A开发平台(由高分辨率1080 p的AR0330摄像头模块、带千兆以太网功能的Hi3516A控制器模块组成硬件平台,并在硬件平台上烧写了…

教材配套PPT初稿

1-10章初稿,基本完整。有些粗糙,后面可能会稍作调整。 附更新情况如下: 1.增加了第10章内容; 2.第5章增加了一些内容; 3.第3章内容部分更新; 4.增加了第8-9章内容。 订正&#xff1a…

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

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

Gearman 启动日志文件提示协议出错的BUG

如果直接以gearmand -d 启动 /usr/local/var/log/gearmand.log 里提示 Address family not supported by protocol ERROR 2014-11-20 20:05:49.000000 [ main ] socket()(Address family not supported by protocol) -> libgearman-server/gearmand.cc:468 ERROR 2014-11-20…

linux环境变量设置方法(PATH等环境变量)

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 linux系统的环境变量有很多,这里简单介绍几个常见环境变量的设置方法。 环境变量PATH 这个环境变量,表示“可执行程序的查找路径”。 1、查看PATH的值,输入“echo $PATH”…

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

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

Android基础知识大纲

原文链接:http://android.eoe.cn/topic/overview * Android是什么?*版本:Android 4.0 r1原始页面:http://developer.android.com/guide/basics/what-is-android.htmlAndroid是一个移动设备的程序集合,包括的操作系统、…

linux unix shell programming,UnixampLinux Shell Programming I.ppt

《Unix&ampLinux Shell Programming I.ppt》由会员分享,可在线阅读,更多相关《Unix&ampLinux Shell Programming I.ppt(17页珍藏版)》请在人人文库网上搜索。1、Unix/Linux Shell Programming I,Dec 14th 2011 Shen Wei,Agenda,Unix/Linux Intro…

被遮挡的绝对定位 z-index

<div class”A” style”position:relative;”>A (relative) <div class”logo” style”position:absolute;z-index:99999;“></div> </div> <div class”B” style”position:relative;”>B (relative)</div> 最近做minisite项目时&…