develooper Front page | perl.beginners | Postings from October 2019

Re: about package method returns

Thread Previous | Thread Next
From:
Andy Bach
Date:
October 31, 2019 21:30
Subject:
Re: about package method returns
Message ID:
CACV6rWKDjHTjsY3vnYk049_bRDfo4EsJ8gpM8skkwPT8aTuxCA@mail.gmail.com
> How do I let the caller know what happens when the method fails to run?

As noted, die() ends the program at that point, sending the text to stderr
and setting an exit code to the shell. If you want your subs are to
communicate with their calling code, you can use the return values to show
success or failure:
sub mytest {

   my $host = shift;
   my $p = Net::Ping->new();
   unless ($p->ping($host)) {
       $p->close();
       return 0;
   }
   return 1;
}

my $host = 'www.google.com';
if ( not A::mytest($host) ) {
   print "failed to ping: $host\n";
}
else {
   print "$host is alive\n";
}

The choice of returning one or zero is up to you (or anything else - a
range of values for different failures), just needs to be agreed on ahead
of time.  You can do something like try/catch blocks around code that dies
by using "eval", something like:
package main;

eval {
A::mytest('www.google.com');
};
if ( $@ ) {
        print "A::mytest died, saying $@\n";
}

The Perl var "$@" gets what ever the called code might have sent to stderr,
e.g.:
$ test_net_ping.pl
A::mytest died, saying can't ping www.google.com at /usr/local/bin/
test_net_ping.pl line 14.

Just to note, as a package test, normally, your package A and B would be
separate scripts (say Apingtest.pm and Bpingtest.pm, in the @INC path) and
the main code would just have
#!/usr/bin/perl
use Apingtest;
use Bpingtest;
use strict;
use warnings;
...

On Thu, Oct 31, 2019 at 4:42 AM Maggie Q Roth <rothmq@gmail.com> wrote:

> Hello
>
> Sorry I am new to perl, I was reading the charter about package.
>
> I tried to write the code below:
>
> use strict;
> use Net::Ping;
>
> package A;
>
> sub mytest {
>
>    my $host = shift;
>    my $p = Net::Ping->new();
>    unless ($p->ping($host)) {
>        $p->close();
>        die "can't ping $host";
>    }
> }
>
> 1;
>
> package B;
>
> sub mytest {
>
>    my $host = shift;
>    my $p = Net::Ping->new();
>    unless ($p->ping($host)) {
>        $p->close();
>        return 0;
>    }
> }
>
> 1;
>
> package main;
>
> A::mytest('www.google.com');
>
> print B::mytest('www.google.com');
>
>
>
> When I run it, always get:
> $ perl test.pl
> can't ping www.google.com at test.pl line 12.
>
>
> Shouldn't I return die() in package's method?
> How do I let the caller know what happens when the method fails to run?
>
> Thanks in advance.
>
> Yours
> Maggie
>


-- 

a

Andy Bach,
afbach@gmail.com
608 658-1890 cell
608 261-5738 wk

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About