> KF> #!/my/path/to/perl
> KF> sub foo_generator { my $a = shift; sub { print $a++ } }
> KF> my $foo = foo_generator(1);
> KF> $foo->();
> Thread-> new($foo);
> KF> Is $a shared between threads or not? If $a is not shared, we've broken
> KF> lexicals.
> Not unless it is so declared my $a :shared.
Sure it is.
Here are some more examples.
Example 1: Passing a reference to a block-scoped lexical into a thread.
#!/my/path/to/perl
foo();
sub foo
{
my $a;
Thread->new(\&bar, \$a)->join;
$a++;
print $a;
}
sub bar
{
my $a = shift;
$$a++;
}
Output: 2
Example 2: Declaring one subroutine within the scope of another
#!/my/path/to/perl
foo();
sub foo
{
my $a;
Thread->new(\&bar)->join;
$a++;
print $a;
sub bar
{
$$a++;
}
}
Output: 2
Example 3: Closures (Ken's example)
#!/my/path/to/perl
my $foo = foo_generator(1);
$foo->();
Thread->new($foo);
sub foo_generator
{
my $a = shift;
sub { print $a++ }
}
Output: 12
- SWM