0

一人でできると思っていたのですが、助けが必要です。

ローカル バンドのメール リストからメール アドレスのリストをテキストエリアに貼り付けて、Perl スクリプトで処理する必要があります。

メールはすべて 1 つの列に表示されます。改行で区切られています:

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 ファイルを取得し、各メンバーにバンドのスケジュールを送信するだけです。他のすべてのものは機能しますが、テキストエリアを配列に入れることができません!

ですから、ご覧のとおり、私はかなり迷っています。

ありがとうございます。もう一度簡単なレッスンをお願いできますか?

4

1 に答える 1

2

あなたは 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]; 

は出力されません123ARRAY(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。これは動作しません; 私はあなたのプログラムを願っていますdied.

上記のすべてのループ タイプを使用できますが (手動で数える必要はありません)、標準の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

于 2012-07-30T23:06:56.767 に答える