Oops, sorry about that. I'd given the answer in a /msg and
totally forgotten that I hadn't given it in a node.
Recall that this is a fairly ambiguous question, and that
my answer really just reveals what the source considers to
be different scopes.
That answer is found in cop.h, line 360 as of recent
perls.
#define CXt_NULL 0
#define CXt_SUB 1
#define CXt_EVAL 2
#define CXt_LOOP 3
#define CXt_SUBST 4
#define CXt_BLOCK 5
#define CXt_FORMAT 6
OK, the easy ones first
- CXt_LOOP is for, e.g.,
while (<>) { ... }.
- CXt_BLOCK is for regular
old blocks, like do { ... } while <>.
- CXt_EVAL
is for eval STRING, not eval BLOCK, which is
covered by CXt_BLOCK.
- CXt_SUB is for a subroutine.
That leaves three: CXt_NULL, CXt_SUBST, and CXt_FORMAT.
You can probably guess what CXt_SUBST and CXt_FORMAT do, even
though the fact that they start new scopes may be surprising.
[~] $ perl -le'$_="foo";s/foo/my $x="bar"/e;print;print ">>>$x<<<"'
bar
>>><<<
There's s/// creating a new scope. Here's format:
[~] $ cat tmp/format
format =
@<<<<<<<
my $x = "foo"
.
write;
print ">>>$x<<<";
[~] $ perl -l !$
perl -l tmp/format
foo
>>><<<
OK, so what does that leave us with? CXt_NULL. CXt_NULL
is the block passed to `sort', strangely enough. It's also
referred to as a pseudo-block throughout the source.
-dlc |