PPIx-QuoteLike
view release on metacpan or search on metacpan
lib/PPIx/QuoteLike.pm view on Meta::CPAN
my $right = substr $middle, -1, 1, '';
return ( $left, $middle, $right );
}
# decode data using the object's {encoding}
# It is anticipated that if I make PPIx::Regexp depend on this package,
# that this will be called there.
sub __decode {
my ( $self, $data, $encoding ) = @_;
$encoding ||= $self->{encoding};
defined $encoding
and _encode_available()
or return $data;
return Encode::decode( $encoding, $data );
}
{
my $encode_available;
sub _encode_available {
defined $encode_available and return $encode_available;
return ( $encode_available = eval {
require Encode;
1;
} ? 1 : 0
);
}
}
{
my ( $cached_doc, $cached_encoding );
# These are the byte order marks documented as being recognized by
# PPI. Only utf-8 is documented as supported.
my %known_bom = (
'EFBBBF' => 'utf-8',
'0000FEFF' => 'utf-32be',
'FFFE0000' => 'utf-32le',
'FEFF' => 'utf-16be',
'FFFE' => 'utf-16le',
);
sub _get_ppi_encoding {
my ( $elem ) = @_;
my $doc = $elem->top()
or return;
$cached_doc
and $doc == $cached_doc
and return $cached_encoding;
my $bom = $doc->first_element()
or return;
Scalar::Util::weaken( $cached_doc = $doc );
if ( $bom->isa( 'PPI::Token::BOM' ) ) {
return ( $cached_encoding = $known_bom{
uc unpack 'H*', $bom->content() } );
}
$cached_encoding = undef;
foreach my $use (
@{ $doc->find( 'PPI::Statement::Include' ) || [] }
) {
'use' eq $use->type()
or next;
defined( my $module = $use->module() )
or next;
'utf8' eq $module
or next;
$cached_encoding = 'utf-8';
last;
}
return $cached_encoding;
}
}
# This subroutine was created in an attempt to simplify control flow.
# Argument 2 (from 0) is not unpacked because the caller needs to see
# the side effects of matches made on it.
{
my %special = (
'$$' => sub { # Process ID.
my ( undef, $sigil ) = @_;
return [ CLASS_INTERPOLATION, $sigil ];
},
'$' => sub { # Called if we find (e.g.) '$@'
my ( undef, $sigil ) = @_;
$_[2] =~ m/ \G ( [\@] ) /smxgc
or return;
return [ CLASS_INTERPOLATION, "$sigil$1" ];
},
'@' => sub { # Called if we find '@@'.
my ( undef, $sigil ) = @_;
return [ CLASS_STRING, $sigil ];
},
);
sub _interpolation { ## no critic (RequireArgUnpacking)
my ( $self, $sigil ) = @_;
# Argument $_[2] is $content, but we can't unpack it because we
# need the caller to see any changes to pos().
if ( $_[2] =~ m/ \G (?= \{ ) /smxgc ) {
# variable name enclosed in {}
my $delim_re = __match_enclosed( qw< { > );
if ( $_[2] =~ m/ \G $delim_re /smxgc ) {
my $rest = $1;
$rest =~ m/ \A \{ \s* \[ ( .* ) \] \s* \} \z /smx
or return [ CLASS_INTERPOLATION, "$sigil$rest" ];
( run in 1.081 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )