AtomicPorkchop
AtomicPorkchop

Reputation: 2675

Declaring a scalar inside an if statement?

Why can't I declare a scalar variable inside an if statement? Does it have something to do with the scope of the variable?

Upvotes: 4

Views: 7718

Answers (4)

ikegami
ikegami

Reputation: 385955

There's an exception: You may not conditionally declare a variable and use it under different conditions. This means the following isn't allowed:

my $x = ... if ...;

Upvotes: 2

Eric Strom
Eric Strom

Reputation: 40152

Every block {...} in Perl creates a new scope. This includes bare blocks, subroutine blocks, BEGIN blocks, control structure blocks, looping structure blocks, inline blocks (map/grep), eval blocks, and the bodies of statement modifier loops.

If a block has an initialization section, that section is considered within the scope of the following block.

if (my $x = some_sub()) {
    # $x in scope here
} 
# $x out of scope

In a statement modifier loop, the initialization section is not contained within the scope of the pseudo block:

$_ = 1 for my ($x, $y, $z);

# $x, $y, and $z are still in scope and each is set to 1

Upvotes: 9

David W.
David W.

Reputation: 107050

Who says you can't?

#! /usr/bin/env perl

use warnings;
no warnings qw(uninitialized);
use strict;
use feature qw(say);
use Data::Dumper;

my $bar;

if (my $foo eq $bar) {
    say "\$foo and \$bar match";
}
else {
    say "Something freaky happened";
}

$ ./test.pl 
$foo and $bar match

Works perfectly! Of course it makes no sense since what are you comparing $foo too? It has no value.

Can you give me an example of what you're doing and the results you're getting?

Or, is this more what you mean?:

if (1 == 1) {
   my $foo = "bar";
   say "$foo";    #Okay, $foo is in scope
}

say "$foo;"    #Fail: $foo doesn't exist because it's out of scope

So, which one do you mean?

Upvotes: 5

Christopher
Christopher

Reputation: 1102

Just to follow up my comment. Statements such as the following is perfectly legal:

if( my( $foo, $bar ) = $baz =~ /^(.*?)=(.*?)$/ ) {
  # Do stuff
}

Courtesy of one of my colleagues.

Upvotes: 4

Related Questions