あなたは Perl に慣れていないので、なぜあなたのコードが悪いのか、どのように改善できるのかを徹底的に説明します。
1 命名規則:
これはシンボリック コードのようですが、 or$emailgoodintheory
よりもはるかに読みにくいことがわかります。任意のスキームを選択してそれに固執します。すべて小文字で書かないでください。$emailGoodInTheory
$email_good_in_theory
私はそれ$emailgoodintheory
が単一の電子メールアドレスを保持していると思います。次に、正規表現s/\s//g
または音訳tr/\s//
を適用するだけで十分です。スペース文字は大文字と小文字が区別されません。
モジュールを使用して住所を検証することは、非常に良い考えです。:-)
2 つの Perl データ型
Perl には 3 つの man 型の変数があります。
スカラーは、文字列、数値、または参照を保持できます。それらは$
シジルで示されます。
配列は、順序付けられたスカラーのシーケンスを保持できます。それらは@
シジルで示されます。
ハッシュは、順序付けられていないスカラーのセットを保持できます。一部の人々はそれらを辞書として知っている傾向があります。すべてのキーとすべての値はスカラーでなければなりません。ハッシュは%
シジルで示されます。
コンテキストに関する単語: ハッシュ/配列から値/要素を取得する場合、シジルを必要なデータ型に変更する必要があります。通常、1 つの値 (常にスカラー) のみを復元するため、$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++)
スカラー contextがあるため、 where@array
は配列の長さを示します。配列内のすべての可能なインデックスの範囲を指定することもできます。$i
for my $i (0 .. $#array)
where..
は範囲演算子 (リスト コンテキスト内) であり$#array
、配列の使用可能な最大のインデックスを提供します。foreachループも使用できます。
foreach my $element (@array)
Perl では、キーワードfor
とキーワードforeach
は交換可能であることに注意してください。
4 ループの機能:
foreach my $address(@toarraya) {
print qq~ $address[$arrcnt]<br /> ~:
$arrcnt++;
}
ここで、 の各要素を@toarraya
スカラーに入れます$address
。次に、それを配列として使用して (間違っています!)、そこからインデックスを取得しようとします$arrcnt
。これは動作しません; 私はあなたのプログラムを願っていますdie
d.
上記のすべてのループ タイプを使用できますが (手動で数える必要はありません)、標準のforeach
ループが最適です。
foreach my $address (@toarraya){
print "$address<br/>\n";
}
構文の引用に関する注意: whileqq~ 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
。