Net::SSH::Perl--遇到“input must be 8 bytes long”的问题

Net::SSH::Perl--遇到“input must be 8 bytes long”的问题

我使用Net::SSH::Perl模块,之前一直没有碰到问题,但是今天在写一段取一个文件大小的语句的时候,遇到:
input must be 8 bytes long at /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/Crypt/DES.pm line 57.
的错误。

出问题的是这一条语句:
                        @main::my_result = $main::telnet -> cmd("/bin/ksh -c \"export LANG=$main::lang;ls -l $controlfile_name\" ");

其中,$controlfile_name,是使用DBI,从SQL语句中获取的控制文件名称。
但是很奇怪,我把$controlfile_name,直接换成文件名,这条语句又可以正常运行。
                        @main::my_result = $main::ssh -> cmd("/bin/ksh -c \"export LANG=$main::my_lang;ls -l /opt/oracle/oradata/ORCL/control03.ctl\" ");

这样可以正常运行。

请问问题出在哪里呢?

谢谢!

完整的段落如下所示:
        #取得数据
        my $controlfile_name;
        my $controlfile_status;
        my $controlfile_size;
        my $row;
        my @row;
        my $array_ref;
        my @my_size;
        my $my_size;
        my $sth1 = $dbh->prepare( "
                SELECT DECODE (STATUS, '', 'OK', 'Error') STATUS,name
                FROM v\$controlfile
                " );

        $sth1->execute();
        $array_ref = $sth1->fetchall_arrayref();

        foreach $row (@$array_ref) {
                ### Split the row up and print each field...
                ($controlfile_name) = @$row[1];
                $controlfile_name =~ s/\s+$//;
                chomp ($controlfile_name);
                print "controlfile is $controlfile_name \n";
                ($controlfile_status) = @$row[0];
                #如果控制文件是裸设备,则大小一栏 显示为Rawdevice !
                if ($controlfile_name =~ m[^/dev]) {
                        $controlfile_size = "Rawdevices !";
                }        elsif ($main::my_telnet == 1) {
                        @main::my_result = $main::telnet -> cmd("/bin/ksh -c \"export LANG=$main::lang;ls -l $controlfile_name\" ");
                        & main::clear_prompt;
                        @my_size = @main::my_result;
                        chomp ( ($my_size) = grep /$controlfile_name/,@my_size);
                        $my_size =  (split /\s+/,$my_size)[4];
                        $my_size = int ($my_size / 1024);
                        $controlfile_size = main::format_number ($my_size);
                }        elsif ($main::my_ssh == 1) {
#                        $controlfile_name = "/opt/oracle/oradata/ORCL/control01.ctl ";
                        @main::my_result = $main::ssh -> cmd("/bin/ksh -c \"export LANG=$main::my_lang;ls -l $controlfile_name\" ");
                        & ssh_login::clear_ssh_prompt;
                        & ssh_login::format_ssh_output;
                        print "controlfile is \n @main::my_result \n";
                        chomp ($my_size = shift(@main::my_result));
#                        @my_size = @main::my_result;
#                        print "controlfile is \n $my_size \n";
#                        chomp ( ($my_size) = grep /$controlfile_name/,@my_size);
                        $my_size =  (split /\s+/,$my_size)[4];
                        $my_size = int ($my_size / 1024);
                        $controlfile_size = main::format_number ($my_size);
                }        elsif ($main::my_local == 1) {
                        @my_size =`ls -l $controlfile_name`;
                        chomp ( ($my_size) = grep /$controlfile_name/,@my_size);
                        $my_size =   (split /\s+/,$my_size)[4];
                        $my_size = int ($my_size / 1024);
                        $controlfile_size = main::format_number ($my_size);
                }        #end of if
http://www.cpanforum.com/posts/2747
谢谢!

不过里面有几点不太明白,能不能麻烦指点一下?

Possible culprit could be encoding. Your input has to have characters 8 byte long. If it's in e.g. utf8, change it this way: from_to ($input,'utf8','iso-8859-1') where from_to must be imported from Encode module. Radek

里面那个 from_to,是什么意思呢?
谢谢这位老大,这个问题已经解决了!

非常感谢,我忙活了一下午了!

use Encode 'from_to';
                        Encode::from_to ($controlfile_name,'utf8','iso-8859-1');
                        @main::my_result = $main::ssh -> cmd("/bin/ksh -c \"export LANG=$main::my_lang;du $controlfile_name\" ");

然后这个问题就解决了。
我只是 google 了一下
为什么我就google不出来呢?

难道google还会检查CU里面ID?

不错的论坛~