您似乎对 Perl 有点陌生,所以我将彻底解释为什么您的代码不好以及如何改进它:
1 命名约定:
我看到这似乎是符号代码,但$emailgoodintheory
比$emailGoodInTheory
or可读性差得多$email_good_in_theory
。选择任何方案并坚持下去,只是不要全部小写。
我想它$emailgoodintheory
拥有一个电子邮件地址。然后应用正则表达式s/\s//g
或音译tr/\s//
就足够了;空格字符不区分大小写。
使用模块来验证地址是一个非常好的主意。:-)
2 Perl 数据类型
Perl 有三种 man 类型的变量:
标量可以保存字符串、数字或引用。它们由$
印记表示。
数组可以保存有序的标量序列。它们由@
印记表示。
哈希可以保存一组无序的标量。有些人倾向于将它们称为字典。所有键和值都必须是标量。哈希由%
印记表示。
关于上下文的一句话:从哈希/数组中获取值/元素时,您必须将印记更改为您想要的数据类型。通常,我们只恢复一个值(它总是一个标量),所以你写$array[$i]
or $hash{$key}
。这不遵循任何参考,所以
my $arrayref = [1, 2, 3];
my @array = ($arrayref);
print @array[0];
不会打印123
,但ARRAY(0xABCDEF)
会给你一个警告。
Perl 中的 3 个循环:
你的循环语法很奇怪!您可以使用 C 风格的循环:
for (my $i = 0; $i < @array; $i++)
where@array
给出了数组的长度,因为我们有一个标量 context。您还可以给出$i
数组中所有可能索引的范围:
for my $i (0 .. $#array)
where..
是范围运算符(在列表上下文中)并$#array
给出我们数组的最高可用索引。我们还可以使用foreach循环:
foreach my $element (@array)
请注意,在 Perl 中,关键字for
andforeach
是可以互换的。
4 你的循环做什么:
foreach my $address(@toarraya) {
print qq~ $address[$arrcnt]<br /> ~:
$arrcnt++;
}
在这里,您将 的每个元素@toarraya
放入 scalar$address
中。然后您尝试将其用作数组(错误!)并从中获取索引$arrcnt
。这不起作用;我希望你的程序die
d。
您可以使用上面给出的每种循环类型(您不需要手动计数),但标准foreach
循环最适合您:
foreach my $address (@toarraya){
print "$address<br/>\n";
}
关于引用语法的注释:虽然qq~ quoted ~
绝对合法,但这是我今天看到的最模糊的代码。标准引号"
就足够了,使用 时qq
,请尝试使用某种括号 ( ({[<|
) 作为分隔符。
5 完整代码:
我假设你想写这个:
my @addressList = split /\r?\n/, CGI::param('toarray');
foreach my $address (@addressList) {
# eliminate white spaces
$address =~ s/\s//g;
# Test for validity
unless (Email::Valid->address($address)) {
# complain, die, you decide
# I recommend:
print "<strong>Invalid address »$address«</strong><br/>";
next;
}
print "$address<br/>\n";
# send that email
}
永远不要忘记use strict; use warnings;
和可能use utf8
。