B-DeparseTree
view release on metacpan or search on metacpan
lib/B/DeparseTree/P518.pm view on Meta::CPAN
}
} elsif ($chr eq "&") {
if ($arg->name =~ /^(s?refgen|undef)$/) {
push @reals, $self->deparse($arg, 6, $op);
} else {
return ('&', []);
}
} elsif ($chr eq "*") {
if ($arg->name =~ /^s?refgen$/
and $arg->first->first->name eq "rv2gv")
{
$real = $arg->first->first; # skip refgen, null
if ($real->first->name eq "gv") {
push @reals, $self->deparse($real, 6, $op);
} else {
push @reals, $self->deparse($real->first, 6, $op);
}
} else {
return ('&', []);
}
} elsif (substr($chr, 0, 1) eq "\\") {
$chr =~ tr/\\[]//d;
if ($arg->name =~ /^s?refgen$/ and
!B::Deparse::null($real = $arg->first) and
($chr =~ /\$/ && B::Deparse::is_scalar($real->first)
or ($chr =~ /@/
&& class($real->first->sibling) ne 'NULL'
&& $real->first->sibling->name
=~ /^(rv2|pad)av$/)
or ($chr =~ /%/
&& class($real->first->sibling) ne 'NULL'
&& $real->first->sibling->name
=~ /^(rv2|pad)hv$/)
#or ($chr =~ /&/ # This doesn't work
# && $real->first->name eq "rv2cv")
or ($chr =~ /\*/
&& $real->first->name eq "rv2gv")))
{
push @reals, $self->deparse($real, 6, $op);
} else {
return ('&', []);
}
}
}
}
return ('&', []) if $proto and !$doneok; # too few args and no ';'
return ('&', []) if @args; # too many args
return ('', \@reals);
}
# Like dq(), but different
sub re_dq {
my $self = shift;
my ($op, $extended) = @_;
my ($re_dq_info, $fmt);
my $type = $op->name;
my ($re, @texts);
my $opts = {};
if ($type eq "const") {
return info_from_text($op, $self, '$[', 're_dq_const', {})
if $op->private & OPpCONST_ARYBASE;
my $unbacked = B::Deparse::re_unback($self->const_sv($op)->as_string);
return B::Deparse::re_uninterp_extended(escape_extended_re($unbacked))
if $extended;
return B::Deparse::re_uninterp(B::Deparse::escape_str($unbacked));
} elsif ($type eq "concat") {
my $first = $self->re_dq($op->first, $extended);
my $last = $self->re_dq($op->last, $extended);
return B::Deparse::re_dq_disambiguate($first, $last);
} elsif ($type eq "uc") {
$re_dq_info = $self->re_dq($op->first->sibling, $extended);
$fmt = '\U%c\E';
$type .= ' uc';
} elsif ($type eq "lc") {
$re_dq_info = $self->re_dq($op->first->sibling, $extended);
$fmt = '\L%c\E';
$type .= ' lc';
} elsif ($type eq "ucfirst") {
$re_dq_info = $self->re_dq($op->first->sibling, $extended);
$fmt = '\u%c';
$type .= ' ucfirst';
} elsif ($type eq "lcfirst") {
$re_dq_info = $self->re_dq($op->first->sibling, $extended);
$fmt = '\u%c';
$type .= ' lcfirst';
} elsif ($type eq "quotemeta") {
$re = $self->re_dq($op->first->sibling, $extended);
@texts = ['\Q', $re->{text},'\E'];
$type .= ' quotemeta';
} elsif ($type eq "fc") {
$re = $self->re_dq($op->first->sibling, $extended);
@texts = ['\F', $re->{text},'\E'];
$type .= ' fc';
} elsif ($type eq "join") {
return $self->deparse($op->last, 26, $op); # was join($", @ary)
} else {
my $info = $self->deparse($op, 26, $op);
$info->{type} = 're_dq';
$info->{text} =~ s/^\$([(|)])\z/\${$1}/; # $( $| $) need braces
return $info;
}
return info_from_list($op, $self, \@texts, '', $type, $opts);
}
sub pure_string {
my ($self, $op) = @_;
return 0 if B::Deparse::null $op;
my $type = $op->name;
if ($type eq 'const' || $type eq 'av2arylen') {
return 1;
}
elsif ($type =~ /^(?:[ul]c(first)?|fc)$/ || $type eq 'quotemeta') {
return $self->pure_string($op->first->sibling);
}
elsif ($type eq 'join') {
my $join_op = $op->first->sibling; # Skip pushmark
return 0 unless $join_op->name eq 'null' && $join_op->targ == OP_RV2SV;
my $gvop = $join_op->first;
( run in 3.196 seconds using v1.01-cache-2.11-cpan-5735350b133 )