0

我想我可以自己做,但我需要一些帮助。

我需要将本地乐队邮件列表中的电子邮件地址列表粘贴到 textarea 中,并在我的 Perl 脚本中处理它们。

电子邮件都在一个列中;由换行符分隔:

email1@email.com
email2@email.com
email3@email.com
email4@email.com
email5@email.com

我显然想摆脱任何空白:

$emailgoodintheory =~ s/\s//ig; 

我正在通过基本验证运行它们:

if (Email::Valid->address($emailgoodintheory)) { #yada

我尝试了各种方法将列表放入数组中。

my $toarray = CGI::param('toarray');
my @toarraya = split /\r?\n/, $toarray;
foreach my $address(@toarraya) {
    print qq~ $address[$arrcnt]<br /> ~:
    $arrcnt++;
}

以上只是为了测试我是否成功。我不需要打印它们。它只是循环,获取时间表 .txt 文件并向每个成员发送乐队时间表。所有其他东西都有效,但我无法将 textarea 放入数组中!

所以,如你所见,我很迷茫。

谢谢老师,我可以再上一堂简单的课吗?

4

1 回答 1

2

您似乎对 Perl 有点陌生,所以我将彻底解释为什么您的代码不好以及如何改进它:

1 命名约定:

我看到这似乎是符号代码,但$emailgoodintheory$emailGoodInTheoryor可读性差得多$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 中,关键字forandforeach是可以互换的。

4 你的循环做什么:

foreach my $address(@toarraya) {
   print qq~ $address[$arrcnt]<br /> ~:
   $arrcnt++;
}

在这里,您将 的每个元素@toarraya放入 scalar$address中。然后您尝试将其用作数组(错误!)并从中获取索引$arrcnt。这不起作用;我希望你的程序died。

您可以使用上面给出的每种循环类型(您不需要手动计数),但标准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

于 2012-07-30T23:06:56.767 回答