> Now that I have the earlier snippet working (and thank you to all who 
> helped), I am working on shuffling my array. Basically, the array is 
> a list of names in the order they will receive a job assignment. 
> Every third week, I want to shuffle the order. I have tested the 
> basics of shuffling the array, and it works just fine. In this code 
> snippet, my @group has already been defined:
> 
> ---begin snippet---
> my @oddgroup = @group[1,3];
> my @evengroup = @group[0,2];
> my @newgroup = (@oddgroup, @evengroup);
> 
> open CONTROL2, '>test.cont';
> print CONTROL2 "Group: @group\n";
> print CONTROL2 "OddGroup: @oddgroup\n";
> print CONTROL2 "EvenGroup: @evengroup\n";
> print CONTROL2 "NewGroup: @newgroup\n";
> close CONTROL2;
> ---end snippet---
> 
> This works just fine. But when I add the mechanism to shuffle every 
> third week, I have problems. The code, which has already set my 
> @group and my $switch is
> 
> ---begin snippet
> if ($switch % 3 == 0)
> {
> my @oddgroup = @group[1,3];
> my @evengroup = @group[0,2];
> my @newgroup = (@oddgroup, @evengroup);
> }
> 
> else
> {my @newgroup = @group};
> 
> open CONTROL2, '>test.cont';
> print CONTROL2 "Group: @group\n";
> print CONTROL2 "NewGroup: @newgroup\n";
> close CONTROL2;
> ---end snippet---
> 
> When I run this, I get two error messages:
> 
> Possible unintended interpolation of @newgroup
> Global symbol "@newgroup" requires explicit package name
> 
> >From reading man perldiag, I understand that the last message is 
> telling me that I either need to lexically scope @group, or declare 
> it beforehand or explicitly qualify it. But haven't I already 
> lexically scoped it? (My guess is that I haven't done that properly, 
> since I'm getting the error message; but I cannot figure out what is 
> wrong with my syntax.) And the other message I didn't find in 
> perldiag.
> 

You have a few TOO many 'my's ... your problem is all revolving around scoping.

In the sort snippet you say my @newgroup = (@oddgroup, @evengroup) and
then in the very next line destroy @newgroup by closing the block.

Using lexical variables is a good thing, but you don't just litter
your code with 'my' -- you have to declare each variable once in the
narrowest usable scope ... 

my @group = qw / Fred Mary Lawrence Georgia / ;
my @newgroup = @group;
my $switch = ...whever this comes from... 

if ( 0 == $switch % 3 )
{
  @newgroup = @group[1,3,0,2];
}

open CONTROL2, '>test.cont' or die "Could not create output file: $!"; 
print CONTROL2 "Group: @group\n";
print CONTROL2 "Newgroup: @newgroup\n"; 
close CONTROL2;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
        Lawrence Statton - [EMAIL PROTECTED] s/aba/c/g
Computer  software  consists of  only  two  components: ones  and
zeros, in roughly equal proportions.   All that is required is to
sort them into the correct order.

-- 
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