0

假设,我有两种情况,一种是短信,另一种是邮件。在这两种情况下我都需要发送消息。现在,为了发送短信,我使用以下 xml。

my $addxml="<tolist><to>";
$addxml=$addxml."<name>".$name."</name>";
$addxml=$addxml."<contactpersonname>".$name."</contactpersonname>";
$addxml=$addxml."<number>".$number."</number>";
$addxml=$addxml."</tolist></to>"

现在,为了发送电子邮件,我将使用相同的 xml,除了我使用电子邮件标签而不是数字

my $addxml="<tolist><to>";
$addxml=$addxml."<name>".$name."</name>";
$addxml=$addxml."<contactpersonname>".$name."</contactpersonname>";
$addxml=$addxml."<email>".$email."</email>";
$addxml=$addxml."</tolist></to>"

我如何在 perl 中编写一个子例程,该子例程将使用上述 xml 一次,但在必要时更改标签(号码和电子邮件)以发送短信或电子邮件。

4

2 回答 2

1

像这样的东西怎么样:

my $sms_xml = xml_gen(
    name              => $name,
    contactpersonname => $contactpersonname,
    number            => $number,
);
my $mail_xml = xml_gen(
    name              => $name,
    contactpersonname => $contactpersonname,
    email             => $email,
);

sub xml_gen {
    my %params = @_;
    my $xml = qq{<tolist><to>};
    foreach my $key (keys %params) {
         $xml = qq{<$key>$params{$key}</$key>};
    }
    $xml .= qq{</to></tolist>};
    return $xml;
}

这种方法的一个优点是您可以根据需要向 XML 中添加任意数量的字段。

如果你想完全抽象它,你可以创建这样的函数:

sub xml_gen {
    my ($name, $number, $email) = @_;
    my $xml = qq{<tolist><to>}
            . qq{<name>$name</name>}
            . qq{<contactpersonname>$name</contactpersonname>;
    $xml .= qq{<number>$number</number>} if $number;
    $xml .= qq{<email>$email</email>}    if $email;
    $xml .= qq{</to></tolist>};
    return $xml;
}

像这样称呼它:

xml_gen($name, $number, $email);

如果$number$emailundef,那么它将从输出中省略。这样,您可以设置一个、另一个或两者。

于 2013-05-31T05:39:05.207 回答
1
use strict;
use warnings;

sub sendout {
  my ($type, $name, $addr) = (shift, shift, shift);
my $addxml =<<EID;
<tolist><to>
  <name>NAME</name>
  <contactpersonname>NAME</contactpersonname>
  <ADDR>@</ADDR> 
</tolist></to>
EID
  $addxml =~ s/NAME/$name/g;
  $addxml =~ s/@/$addr/g;
  $addxml =~ s/ADDR/number/g if ($type eq 'sms');
  $addxml =~ s/ADDR/email/g if ($type eq 'email');
  return $addxml;
}

print sendout('sms', "Fudo", "+1321123321"), "\n";
print sendout('email', "Fudo", "user\@fudo.com"), "\n";
于 2013-05-31T05:44:10.163 回答