--- Ben Curran <[EMAIL PROTECTED]> wrote: > Trying to alter the value of $testfile depending on how many arguments are > given, using the following: > > if (@ARGV == 2) { > chdir $ARGV[0]; > my $testfile = $ARGV[1]; > } > else { > my $testfile = $ARGV[0]; > }
This is syntactically correct, but still fails to do what you expect because of "scope". The scope of a variable (or statement) can often be difficult to tell without proper indenting, so let's fix that up: if (@ARGV == 2) { chdir $ARGV[0]; my $testfile = $ARGV[1]; } else { my $testfile = $ARGV[0]; } There are many different ways to indent, but I chose a style that seemed similar to what you were using, is clean, and also demonstrates this problem well. Good indentation is not always a guarantee of a good programming, but poor indentation is almost always indicative of programming problems. Lexically scoped variables (those declared with the 'my' keyword) have a scope that is confined to the block they are declared in. A block can loosely be defined as a section of the program that is delimited by curly braces {}. As you can see in your example above, you have declared $testfile within braces. It won't exist outside of them. Your next example, which you said works, looks like this when we clear up the indentation: my $testfile; if (@ARGV == 2) { chdir $ARGV[0]; $testfile = $ARGV[1]; } else { $testfile = $ARGV[0]; } You can see that $testfile has been declared *outside* of those blocks. Also, note that a variable that gets declared is also visible to blocks within its declared scope: sub foo { my $bar = shift; my $baz = 0; if ( $bar > 7 ) { $baz += 3; } else { $baz = "Ovid comes up with bad examples"; } return $baz; } Hope that helps. Cheers, Curtis "Ovid" Poe ===== "Ovid" on http://www.perlmonks.org/ Someone asked me how to count to 10 in Perl: push@A,$_ for reverse q.e...q.n.;for(@A){$_=unpack(q|c|,$_);@a=split//; shift@a;shift@a if $a[$[]eq$[;$_=join q||,@a};print $_,$/for reverse @A __________________________________________________ Do You Yahoo!? Check out Yahoo! Shopping and Yahoo! Auctions for all of your unique holiday gifts! Buy at http://shopping.yahoo.com or bid at http://auctions.yahoo.com -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]