如何验证 Perl 中的函数参数?

2024-01-03

你能告诉我 Perl 中验证函数参数最明智的方法是什么吗?

代码片段:

sub testfunction {
    my ($args) = @_;
    my $value = $args->{value} || die "no value set";
    # process value ...
}


testfunction({value => 'Hallo'});

testfunction({novalue => 'Hallo'});

上述方法是在 perl 中验证函数参数的良好替代方法还是有更聪明的方法? 非常感谢大家。


这在很大程度上取决于您想要完成的任务,以及是用户输入、本地功能还是远程功能。

我的意思是,一些参数 - 通过尝试使用它来“验证”要容易得多。例如,文件名 - 不要尝试手动捕获所有边缘情况,只需将其传递给open .... or die $!

有时,“默认并覆盖”更为明智。例如。:

my ( $first_thing, $second_thing ) = @_; 
$first_thing //= "default value";
$second_thing //= 0; 

注意——使用//而不是|| - it's similar在使用中,但它测试只是未定义 - 而不是已定义但错误,例如'' or 0.

有时您希望通过应用一组验证正则表达式来更好地进行验证。请注意,有些事情(例如电子邮件地址或 IP 地址)的彻底验证可能比您想象的要复杂得多,因此“是否存在参数”的简单边缘情况可以发挥作用。

当然,此时您也可以开始查看函数原型 https://perldoc.perl.org/perlsub.html#Prototypes。这与您可能想到的其他语言的原型完全不同:

#!/usr/bin/env perl

#says - must have a single scalar arg. 
sub testfunction($) {
   my ( $required_arg ) = @_; 
   print $required_arg;
}

testfunction(1);
testfunction;

后者将失败:

Not enough arguments for main::testfunction

注意 - Perl 原型检查type and number参数(例如,它是标量还是数组)。但不要检查值,并且can在传递数组时会产生一些意想不到的效果。

我建议传递哈希值非常适合默认机制,因为您可以:

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my %defaults = (
  "test" => 1,
);

sub with_default {
    my %args = (%defaults, @_); 
    print Dumper \%args; 
}

with_default;
with_default(test => 4 );

但回到你原来的情况 - 如果你的函数在没有设置“值”的情况下根本无法工作,那么最好在代码中拼写出来:

if ( not defined $args -> {value} 
  or not $args -> {value} =~ m/^\w+$/ ) {
   die 'value parameter must be supplied and match m/^\w+$/';
}

此时可能值得一提的是“污点”模式。它的一个特点是perl这是您在许多其他语言中看不到的。

它特别告诉解释器“用户提供的”是“被污染的”,因此cannot无需验证即可使用。其中包括不安全的路径、环境变量等。

See perlsec https://perldoc.perl.org/perlsec.html#Taint-mode

But:

#!/usr/bin/env perl -T
use strict;
use warnings;

system "echo $ENV{'USERNAME'}";

会失败——因为system不允许“受污染”的变量。 (但print将要)。在删除“污点”之前,您需要将其通过验证步骤(例如,通常是正则表达式)。

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

如何验证 Perl 中的函数参数? 的相关文章

  • 最小有效 JSON 是多少?

    我仔细阅读了 JSON 描述http json org http json org 但我不确定我是否知道这个简单问题的答案 最小可能的有效 JSON 字符串是什么 string 该字符串是有效的 JSON 吗 42简单的数字是有效的 JSO
  • 如何使用 C# 在 MS Excel 单元格中添加数字验证

    我的目标是限制用户在 MS Excel 单元格中仅输入 1 到 100 范围内的值 我正在以编程方式生成 Excel 文件 但是当我添加上述验证时 抛出异常Exception from HRESULT 0x800A03EC 我写的代码如下
  • 判断字符串是否包含有效的javascript代码

    我正在寻找一个C 返回的函数true如果字符串包含有效的 JavaScript 语法 例如 IsValidJavascript alert hello 会回来true but IsValidJavascript alertXXhelloZ
  • getoptions 函数 perl 多值不起作用

    具有以下 getoptions 功能 iifiles 参数是可选的 如果提供的话它可以是一对多 但是当我运行此函数时收到错误消息 选项规范错误 Perl 在Solaris 10 上运行 不确定需要为iiles 提供哪些多值选项 GetOpt
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • `list()` 被认为是一个函数吗?

    list显然是内置类型 https docs python org 3 library stdtypes html list在Python中 我看到底下有一条评论this https stackoverflow com a 53645813
  • java中将函数作为参数传递

    我正在熟悉 Android 框架和 Java 并希望创建一个通用的 NetworkHelper 类 该类将处理大部分网络代码 使我能够从中调用网页 我按照developer android com 上的这篇文章创建了我的网络类 http d
  • 在 C++ 中,当我将值传递给函数时,它是否总是转换为适当的类型?

    如果我有一个像这样的函数void func size t x 我称该函数为func 5 5 立即转换为size t类型 这通常适用于所有类型吗 我问这个问题是因为我发誓我见过人们编写代码 他们做类似的事情func 5 0 将 5 作为双精度
  • 我应该在哪里对对象和字段进行 django 验证?

    我正在创建一个 Django 应用程序 它使用 Django Rest Framework 和普通的 django views 作为用户的入口点 我想对模型的独立字段以及整个对象进行验证 例如 字段 根据正则表达式函数输入的车牌是否正确 与
  • 如何只读取文件的第一行

    我已经用谷歌搜索了一段时间 但我找不到只读取文件第一行的函数 我需要读取文本文件的第一行并从中提取日期 Perl 新手 open my file lt filename txt my firstLine lt file gt close f
  • Appengine - 隐藏文件夹的部署

    为了验证 SSL 证书 我需要将包含一些文件的隐藏文件夹 well known 上传到我的应用程序 我正在使用 eclipse 部署 java 应用程序 但 appengine 上的应用程序未收到这些文件 我猜他们被过滤掉了 我尝试将隐藏文
  • 执行数组内的函数

    是否可以从数组内部执行匿名函数 也在数组内部定义 return execute function logic 或者我应该在外面定义它然后再调用它 从技术上讲 您可以将该函数括在括号中并像这样调用它 return function retur
  • 如何从 Ruby 模块中仅导入几个函数?

    假设我有一个带有以下方法的模块 function1 function2 function3 我想导入 function1 和 function2 但不导入 function3 有没有办法在红宝石中做到这一点 不确定是否有一种干净的方法来添加
  • 导入 .pl 文件

    我想知道如何将 Perl 文件导入到脚本中 我尝试了 use require 和 do 但似乎没有什么对我有用 这就是我用 require 做到的 usr bin perl require equations print x1 n 是否可以
  • 如何使用 Perl 和正则表达式将 SQL 文档转换为 ColdFusion 脚本?

    我需要将 SQL 语句文档转换为 ColdFusion 文档 我对正则表达式只有一点经验 而且我是 Perl 超级新手 我昨天刚刚自学了它的基础知识 所以我可以完成这项任务 我正在尝试用 Perl 编写的脚本匹配和替换模式 该脚本保存为 B
  • Laravel 5 配置语言环境,不起作用

    已完成的修改 on 配置 应用程序 php locale gt env APP LOCALE en fallback locale gt en on env APP LOCALE pt 我也复制了 资源 lang en文件到 资源 lang
  • CakePHP Unfilled 单选按钮在提交时更改为不需要的值

    我有这个表单元素 form gt input ChecklistResponseGovernmentInfo driversLicenseIsOnline array type gt radio empty gt true options
  • 如何编写 bash 函数来包装另一个命令?

    我正在尝试编写一个函数包装器mysql command If my cnf存在于 pwd 中 我想自动附加 defaults file my cnf到命令 这就是我正在尝试的 function mysql if e my cnf then
  • 我可以在 VIM 或 Perl 中替换单个正则表达式中的多个项目吗?

    假设我有字符串 The Quick Brown Fox Jumps Over the Lazy Dog 我可以用一个正则表达式将其更改为 The Slow Brown Fox Jumps Over the Energy Dog 吗 目前 我
  • 在 Perl 中查找数组的大小

    我似乎遇到过几种不同的方法来查找数组的大小 这三种方法有什么区别呢 my arr 2 print scalar arr First way to print array size print arr Second way to print

随机推荐

  • 无法使用 AT 命令发送短信

    我在用QextSerialPort访问端口 include
  • Django ajax无刷新:django视图无需重定向或刷新页面

    如果在网络上按下该按钮 我想执行一些 Python 代码 问题是 我需要页面不重定向或刷新或任何其他内容 只需使用 jQuery ajax 就很容易做到 在 Django 中 视图 py def fun1 request user inpu
  • onInterceptTouchEvent永远不会收到action_move

    我有一个自定义 ViewGroup 并覆盖了 onInterceptTouchEvent 它收到 ACTION DOWN 但从未收到 ACTION MOVE 据我了解 除非它返回 true 否则它应该接收所有 MotionEvent Vie
  • 如何使用 mongodb 聚合返回字符串数组

    我需要返回带有 mongodb 聚合的字符串数组 我做了以下事情 db users aggregate group id emails address 它返回 id a a com id email protected cdn cgi l
  • 如何在 PHP 中生成多个数组中项目的所有组合

    我正在尝试查找多个数组中项目的所有组合 数组的数量是随机的 可以是 2 3 4 5 每个数组中的元素数量也是随机的 例如 我有 3 个数组 arrayA array A1 A2 A3 arrayB array B1 B2 B3 arrayC
  • R如何根据长格式data.frame列计算相对值?

    我有一个像这样的数据框 我想添加一列gene richness relative 在本专栏中 gene richness价值为days 0应设置为100 作为计算基础 其他日期的相对值应该反映变化 我从几天后排序的 data frame 开
  • R:如何对数据框中定义的不同时间段内的数据进行平均?

    假设我有一个数据框 data 其中包含测量变量 x 的时间序列数据 date x 2009 10 01 00 00 10 2009 10 01 01 00 11 2009 10 01 02 00 12 2009 10 01 03 00 13
  • Qt:没有为 Windows 发行版本生成地图/pdb 文件

    我的 Qt 4 7 4 项目文件在 Windows 发行版本下不会生成 map pdb 文件 因此 事后调试是不可能的 有任何标志可以改变这一点吗 将以下内容添加到 pro 文件中 QMAKE LFLAGS RELEASE MAP QMAK
  • 如何在 Lighttpd 中设置 cookieless 域?

    我想设置禁用 cookie 的域 以提供静态内容 那么就不要在您的域上设置 cookie 严重地 这就是你所要做的 只需使用子域 并确保您不会在该域的任何位置点击任何脚本解决方案 php python 等 另外 请确保您没有启用任何会导致
  • 在 Flutter 中实现推荐奖励

    我想在我的应用程序中建立一个推荐系统 以便用户可以通过电子邮件 电话号码等 以最简单的方式 邀请他们的朋友 当确认被邀请者安装了该应用程序时 它将奖励原始邀请比如说 发件人一个月没有横幅广告 我在网上能找到的唯一参考资料是这个 https
  • HttpMediaTypeNotAcceptableException:在异常处理程序中找不到可接受的表示

    我的控制器中有以下图像下载方法 Spring 4 1 RequestMapping value get image id fileName method RequestMethod GET public ResponseBody byte
  • Spring Boot 管理页面

    我试图了解如何在我的应用程序中使用 SBAP 因为它是一个非常方便的开发工具 我正在读他们的参考指南 http codecentric github io spring boot admin 1 3 2 getting started但我不
  • 如何使用 jQuery 或 CSS 自动调整(拉伸)div 高度和宽度

    我有 4 个 div id 为 A B C 和 D 如下所示 div div div div div div div div div div Div A 和 D 具有固定的宽度和高度 Div B 具有固定宽度 我想要自动计算 Div B 的
  • Pandas 过滤器计数

    我有一些数据按一秒间隔内的出现情况进行分组 我在寻找正确的方法来过滤掉低于特定阈值的计数时遇到问题 例如我不想显示计数低于 100 的任何内容 我尝试了各种版本的过滤器 lambda 构造 但我无法在调用 count 方法之前或之后进行过滤
  • 具有布尔值和多个参数的 python 多处理

    我有一个接受多个参数的函数 其中一些是布尔值 我正在尝试将其传递给多处理pool apply async并想要传递一些带有附加名称的参数 这是我正在使用的示例脚本 from multiprocessing import Pool def t
  • 如何将环境变量传递给docker-compose up

    我正在尝试运行一个容器 我已经将镜像上传到私有 Docker 注册表 我想编写一个撰写文件来下载和部署映像 但我想将标签名称作为变量从 docker compose run 命令传递 我的撰写文件如下所示 如何将 KB DB TAG VER
  • 是否可以升级 Angularjs 属性指令以在 Angular 4 中使用?

    我已经能够升级 AngularJS 元素指令以在 Angular 4 中使用 这是示例代码 myScores js angular module app components directives myScores directive my
  • PHP 上的无限循环的 Pthreads 与 Parallel

    我正在寻找一种在 PHP 上执行多线程的方法 并遇到了 pthreads PHP API 我认为它很容易实现 但是我必须找出如何安装支持 Debian 的 ZTS 的 PHP 版本 问题是 当我查看 pthreads php net 文档时
  • 查找8086微处理器中的物理地址

    在8086微处理器中 20位地址分为16位 4位地址 其中4位二进制是段地址 当我们将4位二进制转换为十六进制时 它会变成1位十六进制 我的问题是当我们遇到计算物理地址的问题时从逻辑地址上看 给出的是一个4bit的十六进制段地址 为什么会这
  • 如何验证 Perl 中的函数参数?

    你能告诉我 Perl 中验证函数参数最明智的方法是什么吗 代码片段 sub testfunction my args my value args gt value die no value set process value testfun