请教高手一个FTP脚本的问题!

请教高手一个FTP脚本的问题!

#!/usr/bin/perl -w
use Net::FTP;
use strict;
use warnings;
my $g_strLastError = "";
my $ftp = Net::FTP->new("103.198.2.113");
if($@)
{
        $g_strLastError = "不能连接到FTP服务器,错误原因:".$@;
        print $g_strLastError;
}
else
{
        $ftp->login("xxxx", "xxxx");
        if($@)
        {
                $g_strLastError = "不能登陆FTP服务器,错误原因:".$@;
                print $g_strLastError;
        }else
        {
                $ftp->binary;
                $ftp->put("HXBVISA20080201", "/home/yksd/xcm/HXBVISA20080201");
                if($@)
                {
                        $g_strLastError = "传输错误,错误原因:".$@;
                        print $g_strLastError;
                }
        }
}
$ftp->quit() or warn "unable to quit: #@\n";

这个是我在网上根据一个大虾的脚本提出来的。想做一个FTP自动上传的脚本。
运行环境是AIX Version 5
可是这个程序正常运行时都对,也就是IP,用户名,密码什么都对的时候,文件能传到指定机器。
可错误的时候没有显示错误信息。比如我把帐户名填错的时候。然后我发现$@这个不管正确与否都始终为空。。。
请高手帮忙解答疑惑!~小弟不胜感激!!!

$@ Alternative: $EVAL_ERROR

The perl error message from the last  eval or do expr command.


QUOTE:
原帖由 DQP 于 2008-11-24 16:08 发表
$@ Alternative: $EVAL_ERROR

The perl error message from the last  eval or do expr command.

不好意思,我英语不是很好,所以不是很理解。。。
是说$@用法不对吗?我是个新手。。。不太明白 呵呵
只有在eval 的 do 的语句快中的程序出现错误 (语法, die......)   $@ 才会被赋值。
如果你想检查是否成功login, 可以检查那一句的返回职.  在perl里 如果函数执行不成功 习惯上会返回各空值.
e.g.
$ftp->login("xxxx", "xxxx") or die....

只能用die吗?用die的话程序就会停止执行了。我不想要这样的效果,我想是如果登陆不成功则再登陆几次。如果都不成功的话就返回!传文件时也一样。 呵呵问题多多啊
呵呵 当然不是只能用die or后面接什么都行.  比如 login(********) or print '切,不玩了';
在perl 里面or是可以接语句的.  只要or前面的值为真 后面的语句就会执行。
下面就是一个在登陆不成功时会反复试几次的例子。。。。。。。
my $retry = 0;
my $limit = 5;
while(1){
    if($retry < $limit){
        if($ftp->login("xxxx", "xxxx")){
            last;
        }
        $retry++;
        next;
    }else{
        print STDERR 'login fail';
        exit(1);
    }
}

或者也可以像别的语言那样 用处理异常的方式来处理错误.

eval{
   login or die
};
if($@){
  log and exit....
}

很感谢DQP同志的热心帮助!
您的第一种方法可以用,第二种方法在我的机器上跑的时候并没有获取错误。。。
$@为空。。。不知道为什么。。。
eval
{
      $ftp->put("HXBVISA20080201", "/home/wksd/xcmx/");
};
if($@)
{
      print "传输失败!\n";
}
上面的路径/home/wksd/xcmx/ 是不存在的。。。
可是无法捕获错误信息~
我的系统是AIX Version 5
perl的版本是perl5
想知道是不是系统的原因~
是这样的只有 和别的语言一样只有抛出异常才能捕获异常
所以要写成这样

eval
{
      $ftp->put("HXBVISA20080201", "/home/wksd/xcmx/")
            or die.......
};
if($@)
{
      print "传输失败!\n";
}
my $ftp = Net::FTP->new("some.host.name", Debug => 0)
      or die "Cannot connect to some.host.name: $@";

   $ftp->login("anonymous",'-anonymous@')
      or die "Cannot login ", $ftp->message;

连的上或连不上对程序来讲都是正常的。$@是捕获异常的,当然会空。