Loading ...
Sorry, an error occurred while loading the content.
 

Re: [PBML] use strict; within loop why " my auto-increment " dont increase.

Expand Messages
  • Charles K. Clarkson
    Leon ... $a and $b are special global variables in perl. They are used in sort . They can also be referred to as $main::a and
    Message 1 of 6 , Jan 2, 2002
      "Leon" <eventualdeath@...>

      : Hi Members,
      :
      : My question :- Could members please help me to understand
      : why $b is not incremented within the while loop below.

      $a and $b are special global variables in perl. They
      are used in 'sort'. They can also be referred to as
      $main::a and $main::b. Let's just do the replacement as
      perl sees it when using my:

      while ($main::a < 10){
      $main::a++;
      my $b++; # why it did not increment?
      print "\$main::a = $main::a\t";
      print "\$b = $b\n";
      };

      print "\n\$main::a = $main::a\n";
      print "\$main::b = $main::b\n";

      which prints:
      $main::a = 1 $b = 1
      $main::a = 2 $b = 1
      $main::a = 3 $b = 1
      $main::a = 4 $b = 1
      $main::a = 5 $b = 1
      $main::a = 6 $b = 1
      $main::a = 7 $b = 1
      $main::a = 8 $b = 1
      $main::a = 9 $b = 1
      $main::a = 10 $b = 1

      $main::a = 10
      $main::b =

      If you turn on warnings, you'll find that $main::b was
      used only once.

      : Just a comment :-
      : Originally, I always thought that in using strict, it is
      : mandatory that I declare all new variables with a 'my'.
      : Correct me if I am wrong, however now I dont think so as
      : this will prevent us from globalising a variable within
      : a block, I have to thank Michael R. Wolf for this.

      You're wrong. Consider yourself corrected. We'll waive
      the standing in the corner bit for now.

      It is mandatory. Except for buil-in perl variables,
      like $_ and $., and for special perl variables that are not
      built-in, like $a and $b.
      $a and $b are special in perl under strict. $a and $b
      are used to pass values to 'sort'. For instance:

      my @sorted = sort { $a <=> $b } qw/1 3 5 2 3 4/;

      doesn't raise any errors, even though $a and $b were
      not declared using 'my'.

      : use strict;
      : while ($a<10){
      : $a++;
      : my $b++; # why it did not increment?
      : print "$a\n";
      : print "$b\n";
      : };
      : print "\$a = $a\n"; # $a = 10 as expected.
      : print "\$b = $b\n"; # $b returns undef, I understand this.

      What we need to do in order to find out what happens
      under strict using "normal" variables is to substitute $c
      and $d for $a and $b in the example above:

      use strict;
      while ($c < 10){
      $c++;
      my $d++; # why it did not increment?
      print "\$c = $c\t";
      print "\$d = $d\n";
      };
      print "\$c = $c\n"; # $c = 10 as expected.
      print "\$d = $d\n"; # $d returns undef, I understand this.
      __END__

      Which gives us the more expected result:

      Global symbol "$c" requires explicit package name at aaa.pl line 14.
      Global symbol "$c" requires explicit package name at aaa.pl line 15.
      Global symbol "$c" requires explicit package name at aaa.pl line 17.
      Global symbol "$c" requires explicit package name at aaa.pl line 20.
      Global symbol "$d" requires explicit package name at aaa.pl line 21.
      Execution of aaa.pl aborted due to compilation errors.


      The moral of the story is:

      Use nice descriptive names for your variables, like $c and $d.

      :)


      HTH,
      Charles K. Clarkson
      Clarkson Energy Homes, Inc.
      254 968-8328


      I refuse to join any club that would have me as a member.
      - Groucho Marx
    • Leon
      ... _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com
      Message 2 of 6 , Jan 2, 2002
        ----- Original Message -----
        From: "Charles K. Clarkson" <cclarkson@...>
        > $a and $b are special global variables in perl. They
        > are used in 'sort'. They can also be referred to as
        > $main::a and $main::b.

        Previously, somebody pointed to me that perl have special reserved words
        such as print, chomp, exists and so on.... , now I realised that perl have
        special variables too.

        To avoid using barewords, warnings have taught me to use UPPERCASE or put
        quotes.
        As I do not know which variables are reserved, I just wonder how to avoid
        using them.

        > : Just a comment :-
        > : Originally, I always thought that in using strict, it is
        > : mandatory that I declare all new variables with a 'my'.
        > : Correct me if I am wrong, however now I dont think so as
        > : this will prevent us from globalising a variable within
        > : a block, I have to thank Michael R. Wolf for this.
        >
        > You're wrong. Consider yourself corrected. We'll waive
        > the standing in the corner bit for now.
        >
        > It is mandatory. Except for buil-in perl variables,
        > like $_ and $., and for special perl variables that are not
        > built-in, like $a and $b.
        > $a and $b are special in perl under strict. $a and $b
        > are used to pass values to 'sort'. For instance:

        Fortunately, I was corrected or my scripts would be in for a big mess.

        Now I could see clearly that Michael R. Wolf thought I was referring to the
        special variable $a, when I ask how to globalise a variable within a block,
        and Michael said to remove the my, which I originally put it as while (
        #.......) {my $a++}

        I wish to repost my question here again.
        When a script gets big, it is quite difficult to keep track of variable
        names, therefore the following question came to my mind.

        Apart from first declaring the lexical variable in the main script, how do
        I, OR , can I, globalise a variable within a block such as this :-

        use strict;
        # without declaring my $how_to_globalise_this_variable here;
        # Can I globalise $how_to_globalise_this_variable within the while loop

        while ( #stuff here ){
        $how_to_globalise_this_variable = 'Global';
        };
        print $how_to_globalise_this_variable;


        > The moral of the story is:
        > Use nice descriptive names for your variables, like $c and $d.

        Normally I do, but for studying sake, I am in the habit of using short names
        such as $a, but now I will use things like $ab_ instead.

        Thanks.



        _________________________________________________________
        Do You Yahoo!?
        Get your free @... address at http://mail.yahoo.com
      • Leon
        Hi Memebrs, To understand things better, could somebody explain to me why in line 6, $number = 5 did not override the outer scope lexical $number.use strict;
        Message 3 of 6 , Jan 2, 2002
          Hi Memebrs,
          To understand things better, could somebody explain to me why in line 6,
          $number = 5 did not override the outer scope lexical $number.

          use strict;
          my $number = 0;
          while ($number < 3){
          $number++; # lets call this OUTER scope $number
          my $number++;
          $number = 5; # line 6
          print '*'x 30,"\n";

          while ($number < 10 ) {
          $number++;
          print "2nd while \$number = $number\n";
          };
          };

          ---- results ----
          ******************************
          2nd while $number = 6
          2nd while $number = 7
          2nd while $number = 8
          2nd while $number = 9
          2nd while $number = 10
          ******************************
          2nd while $number = 6
          2nd while $number = 7
          2nd while $number = 8
          2nd while $number = 9
          2nd while $number = 10
          ******************************
          2nd while $number = 6
          2nd while $number = 7
          2nd while $number = 8
          2nd while $number = 9
          2nd while $number = 10

          ----- end of msg ---------

          ----- Original Message -----
          From: "Leon" <eventualdeath@...>
          > Normally if we declare a my $variable on a previous my $variable, the
          > previous value is taken over by the latest value like this eg :-
          > my $d = 100;
          > my $d = 2;
          > print $d; # value = 2
          >
          > But in the following script, it would be of interest to new Learners, like
          > me, to note that " use strict " sees 2 different $b in the following
          script
          > :-
          >
          > #!d:\perl\bin\perl.exe -w
          > use strict;
          > use CGI::Carp qw(fatalsToBrowser);
          > print "content-type: text/plain\n\n";
          >
          > while ($b<3){
          > $b++; # lets call this OUTER $b
          > my $b++; # this $b does not take over the value of the OUTER $b
          > # even though it is on the same block
          > while ($b < 5 ) {
          > $b++;
          > print "2nd while \$b = $b\n";
          > };
          > };



          _________________________________________________________
          Do You Yahoo!?
          Get your free @... address at http://mail.yahoo.com
        • Charles K. Clarkson
          Leon ... $a, $b and the ones in perlvar. ... I wouldn t reccomend this, but it is posble to create a global variable within a block
          Message 4 of 6 , Jan 3, 2002
            "Leon" <eventualdeath@...>

            : ----- Original Message -----
            : From: "Charles K. Clarkson" <cclarkson@...>
            : > $a and $b are special global variables in perl. They
            : > are used in 'sort'. They can also be referred to as
            : > $main::a and $main::b.
            :
            : Previously, somebody pointed to me that perl have special
            : reserved words such as print, chomp, exists and so on....,
            : now I realised that perl have special variables too.
            :
            : To avoid using barewords, warnings have taught me to use
            : UPPERCASE or put quotes.
            : As I do not know which variables are reserved, I just
            : wonder how to avoid using them.

            $a, $b and the ones in perlvar.

            : > : Just a comment :-
            : > : Originally, I always thought that in using strict, it is
            : > : mandatory that I declare all new variables with a 'my'.
            : > : Correct me if I am wrong, however now I dont think so as
            : > : this will prevent us from globalising a variable within
            : > : a block, I have to thank Michael R. Wolf for this.
            : >
            : > You're wrong. Consider yourself corrected. We'll waive
            : > the standing in the corner bit for now.
            : >
            : > It is mandatory. Except for buil-in perl variables,
            : > like $_ and $., and for special perl variables that are not
            : > built-in, like $a and $b.
            : > $a and $b are special in perl under strict. $a and $b
            : > are used to pass values to 'sort'. For instance:
            :
            : Fortunately, I was corrected or my scripts would be in for
            : a big mess.
            :
            : Now I could see clearly that Michael R. Wolf thought I was
            : referring to the special variable $a, when I ask how to
            : globalise a variable within a block, and Michael said to
            : remove the my, which I originally put it as
            : while (#.......) {my $a++}
            :
            : I wish to repost my question here again.
            : When a script gets big, it is quite difficult to keep track
            : of variable names, therefore the following question came to
            : my mind.
            :
            : Apart from first declaring the lexical variable in the main
            : script, how do I, OR, can I, globalise a variable within a
            : block such as this :-
            :
            : use strict;
            : # without declaring my $how_to_globalise_this_variable here;
            : # Can I globalise $how_to_globalise_this_variable within the
            : # while loop
            :
            : while ( #stuff here ){
            : $how_to_globalise_this_variable = 'Global';
            : };
            : print $how_to_globalise_this_variable;

            I wouldn't reccomend this, but it is posble to create
            a global variable within a block without having previously
            used it.

            while ( #stuff here ){
            $::globalised_variable = 'Global';
            }
            print $::globalised_variable;


            By uing $:: (which is the same as $main::) you
            are adding the veriable directly to the symbol table.
            You'll have to use the $:: or $main:: prefix for the
            whole script, but strict won't raise an error.

            It would be better to make the block return
            something.

            my $file_scoped_variable = do {
            while ( #stuff here ){
            my $block_scoped_variable = 'Global';
            }
            $block_scoped_variable; };


            HTH,
            Charles K. Clarkson
            Clarkson Energy Homes, Inc.
            254 968-8328


            How do they get the deer to cross at that yellow road sign?
          Your message has been successfully submitted and would be delivered to recipients shortly.