+ -
当前位置:首页 → 问答吧 → 将已有程序子程序编辑为包,调用时候的问题

将已有程序子程序编辑为包,调用时候的问题

时间:2011-01-20

来源:互联网

包为以下:
package Util::Mail;

use strict;
use warnings;
use Net::SMTP;

sub new
{
my($class,$mtahost,$mtaport)=@_;
my $smtp = Net::SMTP->new('Host'=>$mtahost,'Port'=>$mtaport)||die "[WARN] Can't connect to SMTP host\n";
return $smtp;}

sub sendm
{
my ($smtp,$msg)=@_;
$smtp->mail("monitor\@dangdang.com");
$smtp->recipient("jsliyan\@dangdang.com");
$smtp->data();
$smtp->datasend("From: Server Monitor <monitor\@dangdang.com>\n");
$smtp->datasend("To: SA Team <sa\@dangdang.com>\n");
$smtp->datasend("Subject: Server Warnings\n");
$smtp->datasend("\n");
for (@$msg) {
$smtp->datasend("$_\n");
}
$smtp->dataend();
$smtp->quit;
}

1;

使用程序调用的时候:
my $mail=Util::Mail->new('127.0.0.1','25');
$mail->Util::Mail::sendm($warns);         
可以实现,如果换成下:
my $mail=Util::Mail->new('127.0.0.1','25');
$mail->sendm($warns);          就报:Can't locate object method "sendm" via package "Net::SMTP"

请问有其他写法可以实现调用吗

作者: liyangole   发布时间: 2011-01-20



QUOTE:
sub sendm
{
my ($smtp,$msg)=@_;




在目标方法里,第一个参数是$self,要shift出来。

作者: 兰花仙子   发布时间: 2011-01-20

回复 兰花仙子


    了解了。还有就是我用那个调用必需是这样才行,$mail->Util::Mail::sendm($warns)
   不可以用$mail->sendm($warns).还用其他写法可行吗?

作者: liyangole   发布时间: 2011-01-20

因为你没有祈福
所以Util::Mail->new出来的其实不是一个Util::Mail,而是一个Net::SMTP

作者: yiten   发布时间: 2011-01-20

回复 yiten


    一针见血 谢谢。

作者: liyangole   发布时间: 2011-01-20

回复 yiten

这样祈福以后,那个sendm方法调用就报 Can't locate object method "mail" via package "Util::Mail" ,这个方法写的问题了。请帮忙看看

作者: liyangole   发布时间: 2011-01-20

帮你写一下吧:
  1. package Util::Mail;

  2. use strict;
  3. use warnings;
  4. use Net::SMTP;

  5. sub new
  6. {
  7.     my ($class,$mtahost,$mtaport) = @_;
  8.     my $smtp = Net::SMTP->new(Host=>$mtahost,Port=>$mtaport,Debug=>1) || die "[WARN] Can't connect to SMTP host\n";
  9.     bless {'smtp'=>$smtp},$class;
  10. }

  11. sub sendm
  12. {
  13.     my $self = shift;
  14.     my $msg = shift;
  15.     my $smtp=$self->{smtp};
  16.     $smtp->mail("monitor\@dangdang.com");
  17.     $smtp->recipient("jsliyan\@dangdang.com");
  18.     $smtp->data();
  19.     $smtp->datasend("From: Server Monitor <monitor\@dangdang.com>\n");
  20.     $smtp->datasend("To: SA Team <sa\@dangdang.com>\n");
  21.     $smtp->datasend("Subject: Server Warnings\n");
  22.     $smtp->datasend("\n");
  23.     for (@$msg) {
  24.         $smtp->datasend("$_\n");
  25.     }
  26.     $smtp->dataend();
  27.     $smtp->quit;
  28. }

  29. 1;
复制代码
调用:
  1. use strict;
  2. use Util::Mail;

  3. my $s = Util::Mail->new('smtp.xxx.com',25);
  4. $s->sendm(["hello","world"]);
复制代码

作者: 兰花仙子   发布时间: 2011-01-20