74redvette has asked for the wisdom of the Perl Monks concerning the following question:

We have a PERL script we use to FTP files. It has been in use for over 10 years. Recently one of our test UNIX boxes was updated to Perl 5.8.8. Now when the script is executed, it returns an error: Use of uninitialized value in join or string at /usr/opt/perl5/lib/5.8.8/IO/Socket/INET.pm line 83 Any idea what might have caused this issue between the 2 Perl versions?

Replies are listed 'Best First'.
Re: 5.8.2 vs 5.8.8
by fidesachates (Monk) on Jan 06, 2011 at 16:16 UTC
    I would take a look at the script and compare it to the cpan documentation at http://search.cpan.org/~gbarr/IO-1.25/lib/IO/Socket/INET.pm

    There's a good chance when you upgraded the Perl, the modules were also upgraded and some of the methods in the module have changed.

    Just a thought.

    By the way, the uninitialized value warning simply indicates you are using a empty/undefined value in a join method in the module. That's why I believe you're not using the module correctly. However, since you've been using the script for 10 years, I'm suggesting the module version has changed.
      It appears the Net::FTP is handling our variables from the script a bit differently. Short story, I modified that piece of our script and it works. Error snippet of code:  $ftp = Net::FTP->new(@ARGV[0],5) or exit(1); Working snippet of code:  $ftp = Net::FTP->new(@ARGV[0]) or exit(1); Thanks all for the great hints and advice.
Re: 5.8.2 vs 5.8.8
by ikegami (Patriarch) on Jan 06, 2011 at 17:07 UTC

    That warning comes from the error handler.

    sub _error { my $sock = shift; my $err = shift; { local($!); my $title = ref($sock).": "; $@ = join("", $_[0] =~ /^$title/ ? "" : $title, @_); <-- 83 close($sock) if(defined fileno($sock)); } $! = $err; return undef; }

    It's not $title that's undef because that would cause the match operator to warn too. It's one of the arguments.

    The warning is inconsequential. It's just the symptom of another bug, a bug that's already being reported as an error by Socket. _error is only called from the constructor, so that means the constructor is failing. What error is being returned when you try to create the socket?

      The diagnostics states: Use of uninitialized value in join or string at /usr/opt/perl5/lib/5.8.8/IO/Socket/INET.pm line 83 (#1) (W uninitialized) An undefined value was used as if it were already defined. It was interpreted as a "" or a 0, but maybe it was a mistake. To suppress this warning assign a defined value to your variables. To help you figure out what was undefined, perl tells you what operation you used the undefined value in. Note, however, that perl optimizes your program and the operation displayed in the warning may not necessarily appear literally in your program. For example, "that $foo" is usually optimized into "that " . $foo, and the warning will refer to the concatenation (.) operator, even though there is no . in your program. We are passing parameters that contain the server userid password ascii/binary remote directory, local directory and file name. Those all appear to be filled in correctly.

        I know what the warning means. I'm asking what error you're getting when you try to create the socket.

        Or how about this. What's the output of the following?

        perl -MCarp::Always your_script.pl
Re: 5.8.2 vs 5.8.8
by toolic (Bishop) on Jan 06, 2011 at 16:31 UTC
    Any idea what might have caused this issue between the 2 Perl versions?
    According to the perl588delta document, warnings was updated. Perhaps this type of warning situation was not detected in 5.8.2, but now it is in 5.8.8.

    I see no indication of a change to the IO::Socket::INET Core module in the delta docs.

    In any case, you should try to track down the origin of the warning message and fix it. You can use diagnostics to perhaps give you more information.

    Is your code still working the same as before, despite the new warning message?

      I see no indication of a change to the IO::Socket::INET Core module in the delta docs.

      5.8.4
      IO [no description of version numbers]

      5.8.7
      IO::Socket upgraded to version 1.28

      5.8.8
      IO upgraded to version 1.22
      * Enhanced documentation
      * Internal cleanup