但我对PERL一无所知。
那么解决方案是
(顺便说一句,该语言称为Perl,用于运行 Perl 程序的解释器称为perl。其他大写形式有点不受欢迎)。
如果您决定尝试自己解决这个问题,这里有一些建议:
问题可以分解为子问题:
解析规则文件。使用该split
功能相当容易。
该函数接受零到三个参数:正则表达式、字符串、限制。如果省略限制,则生成的片段数是任意的。如果省略字符串,则使用$_
特殊变量。如果省略了正则表达式,它将被视为" "
赋予了特殊值:拆分所有空格,并删除前导空格。
要解析一行,必须执行以下操作:
chomp
用,删除尾随换行符
- 将行拆分
:
为发送者和规则字符串,最多两个片段,
- 将规则字符串拆分
,
为单个规则,
- 将每个规则拆分
@
为用户和域部分。
然后可以将规则保存在数据库或 Perl 数据结构中。
给定一对发送者和接收者地址的匹配规则。在数据库的情况下,这可以通过一个很好的 SQL 查询来完成。对于 Perl 数据结构,您将:
- 检索发件人地址的所有规则
- 遍历所有规则:匹配用户和域部分并在两者匹配时返回 true。
- 否则,返回 false
将规则与地址匹配将首先检查规则部分(用户/域)是否为*
. 否则,将测试这些部分是否相等。用户和域部分都必须匹配才能匹配整个规则。
选择一个好的 Perl 数据结构:为了让我们的生活更轻松,所有的电子邮件地址和规则都只以它们的规范化形式处理。这意味着例如小写。对于上述算法中的每个对象,可以定义一个单独的类。这可能是不可取的。反而,
- 每个规则都可以表示为一个 2 值数组引用
- 发送者的规则列表可以表示为规则的数组引用。
- 发送者地址和接收者规则之间的关联可以通过散列进行。
代码示例
解析一行
其中行在 中给出$_
,并且 hashref$rules_for_sender
在范围内
chomp;
my ($sender, $rules) = map lc, split /:/, $_, 2;
my @rules = map [split /@/], split /,/, $rules;
$rules_for_sender->{$sender} = \@rules;
遍历发件人的所有规则
for my $rule (@{ $rules->{$sender} } {
my ($rule_user, $rule_domain) = @$rule;
...; # do stuff here
}
剩下的……</h3>
…如果你记得的话,这几乎是微不足道的
- 正确规范化,
- 这
use strict; use warnings;
可以帮助您发现许多错误,并且
- 该字符串比较是由
eq
操作员完成的。