OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD
OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
- OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER
+ OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER
OPpSORT_REVERSE
SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
CVf_METHOD CVf_LVALUE
($] < 5.008009 ? () : qw(OPpCONST_NOVER OPpPAD_STATE)),
($] < 5.009 ? 'PMf_SKIPWHITE' : qw(RXf_SKIPWHITE)),
($] < 5.011 ? 'CVf_LOCKED' : 'OPpREVERSE_INPLACE'),
- ($] < 5.013 ? () : 'PMf_NONDESTRUCT');
-$VERSION = "1.06";
+ ($] < 5.013 ? () : 'PMf_NONDESTRUCT'),
+ ($] < 5.015003 &&
+ # This empirical feature test is required during the
+ # transitional phase where blead still identifies itself
+ # as 5.15.2 but has had $[ removed. After blead has its
+ # version number bumped to 5.15.3, this can be reduced to
+ # just test $] < 5.015003.
+ ($] < 5.015002 || do { require B; exists(&B::OPpCONST_ARYBASE) })
+ ? qw(OPpCONST_ARYBASE) : ());
+$VERSION = "1.08";
use strict;
use vars qw/$AUTOLOAD/;
use warnings ();
# be to fake up a dummy constant that will never actually be true.
foreach (qw(OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED OPpCONST_NOVER
OPpPAD_STATE RXf_SKIPWHITE CVf_LOCKED OPpREVERSE_INPLACE
- PMf_NONDESTRUCT)) {
+ PMf_NONDESTRUCT OPpCONST_ARYBASE)) {
no strict 'refs';
*{$_} = sub () {0} unless *{$_}{CODE};
}
}
elsif ($name eq '$[') {
- $arybase = $val;
+ if (OPpCONST_ARYBASE) {
+ $arybase = $val;
+ } else {
+ croak "\$[ can't be non-zero on this perl" unless $val == 0;
+ }
}
elsif ($name eq 'integer'
# If a lexical with the same name is in scope, it may need to be
# fully-qualified.
sub stash_variable {
- my ($self, $prefix, $name) = @_;
+ my ($self, $prefix, $name, $cx) = @_;
return "$prefix$name" if $name =~ /::/;
return "$prefix$name";
}
+ if ($name =~ /^[^\w+-]$/) {
+ if (defined $cx && $cx == 26) {
+ if ($prefix eq '@') {
+ return "$prefix\{$name}";
+ }
+ elsif ($name eq '#') { return '${#}' } # "${#}a" vs "$#a"
+ }
+ if ($prefix eq '$#') {
+ return "\$#{$name}";
+ }
+ }
+
my $v = ($prefix eq '$#' ? '@' : $prefix) . $name;
return $prefix .$self->{'curstash'}.'::'. $name if $self->lex_in_scope($v);
return "$prefix$name";
$self->{'curstash'} = $stash;
}
- if ($self->{'arybase'} != $op->arybase) {
+ if (OPpCONST_ARYBASE && $self->{'arybase'} != $op->arybase) {
push @text, '$[ = '. $op->arybase .";\n";
$self->{'arybase'} = $op->arybase;
}
: "CORE::$name";
}
if (
- $name !~ /^(?:chom?p|exec|system)\z/
+ $name !~ /^(?:chom?p|exec|s(?:elect|ystem))\z/
&& !defined eval{prototype "CORE::$name"}
) { return $name }
if (
my($op, $cx) = @_;
my $gv = $self->gv_or_padgv($op);
return $self->maybe_local($op, $cx, $self->stash_variable("\$",
- $self->gv_name($gv)));
+ $self->gv_name($gv), $cx));
}
sub pp_gv {
}
my $kid = $op->first;
if ($kid->name eq "gv") {
- return $self->stash_variable($type, $self->deparse($kid, 0));
+ return $self->stash_variable($type, $self->deparse($kid, 0), $cx);
} elsif (is_scalar $kid) {
my $str = $self->deparse($kid, 0);
if ($str =~ /^\$([^\w\d])\z/) {
} elsif (!ref($replroot) and $replroot > 0) {
$gv = $self->padval($replroot);
}
- $ary = $self->stash_variable('@', $self->gv_name($gv)) if $gv;
+ $ary = $self->stash_variable('@', $self->gv_name($gv), $cx) if $gv;
for (; !null($kid); $kid = $kid->sibling) {
push @exprs, $self->deparse($kid, 6);
=item $[
Takes a number, the value of the array base $[.
+Cannot be non-zero on Perl 5.15.3 or later.
=item bytes