DevCN
菜单
全部文章快讯开发科技深度热点

Perl 输入验证:用完整锚点拒绝尾随字符

验证完整分钟数字符串的格式和长度,再检查业务范围,理解绝对起止锚点与未定义输入检查顺序。


本节目标

验证完整分钟数字符串的格式和长度,再检查业务范围,理解绝对起止锚点与未定义输入检查顺序。

环境与运行方法

使用 Perl 5,保存为 lesson.pl,执行 perl -c lesson.pl 后运行 perl lesson.pl。启用 strict 和 warnings,及时发现名称或未定义值问题。

核心思路

验证应覆盖整段文本,而不是在其中找出一个数字片段。绝对起止锚点限定完整匹配,一到四位 ASCII 数字让转换规模受控。

完整示例

use strict;
use warnings;
sub minutes {
    my ($text) = @_;
    return undef unless defined $text && $text =~ /\A[0-9]{1,4}\z/;
    my $value = 0 + $text;
    return undef if $value > 1440;
    return $value;
}
for my $text ("30", "0", "12x", "1441") {
    my $value = minutes($text);
    print defined($value) ? "ok=$value\n" : "invalid\n";
}

预期输出

ok=30
ok=0
invalid
invalid

逐步理解

defined 在正则之前,避免未定义值参与匹配。只有格式通过才做数值运算,坏文本不会被解释成部分数字。返回 undef 表示失败,输出用 defined 保留合法零。

本协议不允许换行、符号和空白。读取文件时可以按文件格式先去除行结束符,再验证字段;不应该删除所有非数字字符,因为那可能把错误记录修改成另一条看似合法的数据。

常见问题与边界

  • 真假判断会把零误认为失败。
  • 正则通过仍可能超过 1440。
  • 清洗规则必须有明确边界。

动手练习

测试 "30\n"、"0000" 和 "-1"。

参考答案

带换行文本失败,四个零得到零,负号失败。文件读取是否 chomp,应在输入层定义,而不是偷偷改变校验函数。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。