On Friday, August 2, 2002, at 08:09 , Chad Kellerman wrote:
[..]
> ** I always have issues with scope....  Can I use Sys::Hostname  just in
> the subroutine, or any perl module for that matter?  Or do I have to use
> it globally?
>
> $host=hostname; finds that daggone hostname and I have hostname all over
> te place....my bad.  :^(.
[..]


there are two strategies I hear you are asking about:

        a) the difference between 'use v. require'
        b) the scoping of variables


plan A:

        #!/usr/bin/perl -w
        use strict;

        use Sys::Hostname

        ......

        sub Freak_Out {

                my $msg = shift;
                .....
                my $host = hostname;
                ....
        }

the 'use' of course is essentially 'require foo && import foo'
so we imported the function there - and might not remember where
we got that function from - especially if we did not annotate
it up at the top of the script.

so you might try
plan B:

        #!/usr/bin/perl -w
        use strict;

        .....

        sub Freak_Out {

                my $msg = shift;
                .....
                require Sys::Hostname;
                my $host = Sys::Hostname::hostname();
                ....
        }

and completely ISOLATE the fact that you are using
the hostname() function there.


Your Third strategy would be something on the order of say


        #!/usr/bin/perl -w
        use strict;

        use Sys::Hostname
        my $host = hostname;

        ......

        sub Freak_Out {
                my ( $from_host, $msg ) = @_;
                ....
        }

hence requiring the caller to define it.

What I personally would consider the worst of all possibles
in this is the 'leaking global gag':

        #!/usr/bin/perl -w
        use strict;

        use Sys::Hostname
        my $host = hostname;

        ......

        sub Freak_Out {
                my ( $msg ) = @_;
                ....

                Log($host, $msg);
                ...
        }

where you USE the globally defined '$host' without passing
it into the function.... this type of 'side effect' gets
ugly the first time you try to re-use the function Freak_Out()
somewhere else.... and forget that you were using a global
variable by indirection.


HTH

ciao
drieux

---


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to