I think the only difference between the two is Stat's code do the things of 
sharing vars across modules really.
Under mod_perl,the situation is very different from common CGI environment,and 
the vars sharing sometimes is useful and needed.
I hope I'm correct.If not,the criticism are welcome.

-----Original Message-----
>From: John Doe <[EMAIL PROTECTED]>
>Sent: Jan 16, 2006 4:09 AM
>To: beginners@perl.org
>Subject: Re: about the var's scope
>
>Shawn Corey am Montag, 16. Januar 2006 04.12:
>[...]
>> > Ok, it would be interesting to look deeper into the mess of different
>> > variables all named with the same name $q, exported across the modules,
>> > overwritten by several imports...
>> >
>> > What do you want to achieve with your code? It looks really strange (hm,
>> > at least to me).
>> >
>> > joe
>>
>> All the variables $q in the packages have been shunted aside into the
>> deep, dark bit bucket of oblivion.
>>
>> As I said before:
>>
>>    $main::q = \*My::HTML::q;
>>    $main::q = \*My::Doc::q;
>>
>> $My::HTML::q and $My::Doc::q no longer exist; they are aliases to
>> $main::q. In the modules, $q no longer exists; it is an alias for
>> $main::q. Whenever you say $q in the modules, you really mean $main::q.
>> The modules do not import anything; they export any changes to $main::q;
>> via the phrase '$q'.
>
>Hi again Shawn,
>
>I have a question concerning the code presented in the OP. I repeat it for 
>better overview:
>
>==== Version 1 ====
>  script.pl:
>  ----------------
>  use vars qw($q);
>  use CGI;
>  use lib qw(.); 
>  use My::HTML qw($q); # My/HTML.pm is in the same dir as script.pl
>  use My::Doc  qw($q); # Ditto
>  $q = new CGI;
>
>  My::HTML::printmyheader();  
>  
>  My/HTML.pm
>  ----------------
>  package My::HTML;
>  use strict;
>
>  BEGIN {
>    use Exporter ();
>    @My::HTML::ISA         = qw(Exporter);
>    @My::HTML::EXPORT      = qw();
>    @My::HTML::EXPORT_OK   = qw($q);
>  }
>  use vars     qw($q);
>  use My::Doc  qw($q);
>  sub printmyheader{
>    # Whatever you want to do with $q... e.g.
>    print $q->header();
>    My::Doc::printtitle('Guide');
>  }
>  1;  
>  
>  My/Doc.pm
>  ----------------
>  package My::Doc;
>  use strict;
>
>  BEGIN {
>    use Exporter ();
>    @My::Doc::ISA         = qw(Exporter);
>    @My::Doc::EXPORT      = qw();
>    @My::Doc::EXPORT_OK   = qw($q);
>  }
>  use vars qw($q);
>  sub printtitle{
>    my $title = shift || 'None';
>    print $q->h1($title);
>  }
>  1;
>==== END Version 1====
>
>The code demonstrates the usage of the use vars pragma and the Exporter.
>
>However, my personal feeling ist that in a bigger project it is eventually bad 
>style to use globals this way?!?
>
>Do you agree? Or do I  - again - overlook something?
>
>See the equivalent code below as an alternative:
>
>==== Version 2 ====
>  script.pl:
>  ----------------
>  use CGI;
>  use lib qw(.); 
>  use My::HTML;
>  my $q = new CGI;
>
>  My::HTML::printmyheader($q);  
>  
>  My/HTML.pm
>  ----------------
>  package My::HTML;
>  use strict;
>
>  use My::Doc;
>  sub printmyheader{
>   my $q=shift;
>   ### DO CHECKS HERE
>   # Whatever you want to do with $q... e.g.
>   print $q->header();
>   My::Doc::printtitle($q, 'Guide');
>  }
>  1;  
>  
>  My/Doc.pm
>  ----------------
>  package My::Doc;
>  use strict;
>
>  sub printtitle{
>    my $q=shift;
>    ### DO CHECKS HERE
>    my $title = shift || 'None';
>    print $q->h1($title);
>  }
>  1;
>==== END Version 2====
>
>This version does the same, is shorter, is easier to understand for some 
>people, does not require Exporter, and does not need use'ing My::Doc in the 
>main script (it's more modular).
>
>Does this 2nd version lack any features/magic present in the 1st?
>(Apart from demonstrating use vars / Exporter of course)
>
>Any comments are very appreciated!
>
>greetings 
>joe
>
>-- 
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
><http://learn.perl.org/> <http://learn.perl.org/first-response>
>
>


--
http://home.earthlink.net/~pangj/

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to