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,应在输入层定义,而不是偷偷改变校验函数。
文章回复
0 条公开回复