Babble v0.090007_01 Perl 5 v5.32.0 i686-linux
- Status
- Fail
- From
- David Cantrell (DCANTRELL)
- Dist
-
Babble v0.090007_01
- Platform
- Perl 5 v5.32.0 i686-linux
- Date
- 2022-09-06 01:58:09
- ID
- 5b1cc56a-2d87-11ed-a802-c1de9a3b566c
This distribution has been tested as part of the CPAN Testers
project, supporting the Perl programming language. See
http://wiki.cpantesters.org/ for more information or email
questions to cpan-testers-discuss@perl.org
--
Dear Zakariyya Mughal,
This is a computer-generated report for Babble-0.090007_01
on perl 5.32.0, created by CPAN-Reporter-1.2018.
Thank you for uploading your work to CPAN. However, there was a problem
testing your distribution.
If you think this report is invalid, please consult the CPAN Testers Wiki
for suggestions on how to avoid getting FAIL reports for missing library
or binary dependencies, unsupported operating systems, and so on:
http://wiki.cpantesters.org/wiki/CPANAuthorNotes
Sections of this report:
* Tester comments
* Program output
* Prerequisites
* Environment and other context
------------------------------
TESTER COMMENTS
------------------------------
Additional comments from tester:
this report is from an automated smoke testing program
and was not reviewed by a human for accuracy
------------------------------
PROGRAM OUTPUT
------------------------------
Output from './Build test':
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlSubroutineDeclaration>(?<PerlWrapperSubroutineDeclaration_001>(?&PerlBabbleInnerMatch)|(?&PerlStdSubroutineDeclaration)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>sub \b (?&PerlOWS) (?&PerlOldQualifiedIdentifier)(?:(?: (?&PerlOWS) (?>(?&PerlAttributes)) )?+(?&PerlOWS) (?&PerlParenthesesList)(?&PerlOWS)|(?&PerlOWS)(?&PerlParenthesesList) (?&PerlOWS)(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+)(?&PerlBlock))
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2198.
t/plugin-coresignatures.t .......
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlStatement>(?<PerlWrapperStatement_001>(?&PerlBabbleInnerMatch)|(?&PerlStdStatement)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>(?>(?&PerlPrefixPostfixTerm))(?>(?&PerlOWS) //=)(?>(?&PerlOWS))(?>(?&PerlPrefixPostfixTerm))(?>(?&PerlOWS))
(?&PerlStatementModifier)?+
(?>(?&PerlOWS))
(?> ; | (?= \} | \z ))
)
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2202.
t/plugin-definedor.t ............
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlStatement>(?<PerlWrapperStatement_001>(?&PerlBabbleInnerMatch)|(?&PerlStdStatement)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>\.\.\.)
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2198.
t/plugin-ellipsis.t .............
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlPackageDeclaration>(?<PerlWrapperPackageDeclaration_001>(?&PerlBabbleInnerMatch)|(?&PerlStdPackageDeclaration)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND))
(?> (?&PerlBlock) )
)
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2205.
t/plugin-packageblock.t .........
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlPackageDeclaration>(?<PerlWrapperPackageDeclaration_001>(?&PerlBabbleInnerMatch)|(?&PerlStdPackageDeclaration)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?>(?&PerlNWS))
(?&PerlVersionNumber)
(?>(?&PerlOWSOrEND))
(?> ; | (?&PerlBlock) | (?= \} | \z ))
)
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2209.
t/plugin-packageversion.t .......
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlUseStatement>(?<PerlWrapperUseStatement_001>(?&PerlBabbleInnerMatch)|(?&PerlStdUseStatement)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>use\s+experimental\s+.*?;)
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2198.
t/plugin-postfixderef.t .........
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlSubroutineDeclaration>(?<PerlWrapperSubroutineDeclaration_001>(?&PerlBabbleInnerMatch)|(?&PerlStdSubroutineDeclaration)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>sub \b (?&PerlOWS) (?&PerlOldQualifiedIdentifier) (?&PerlOWS)(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+(?&PerlBlock)(?&PerlOWS))
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2198.
t/plugin-sigify.t ...............
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlUseStatement>(?<PerlWrapperUseStatement_001>(?&PerlBabbleInnerMatch)|(?&PerlStdUseStatement)))
(?<PerlTryCatch>(?<PerlStdTryCatch>try(?&PerlOWS)(?&PerlBlock)(?:(?&PerlOWS)catch(?&PerlOWS)(?&PerlBlock))?+))
(?<PerlStatement>(?<PerlWrapperStatement_001>(?&PerlTryCatch)|(?&PerlStdStatement)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>use\s+Syntax::Keyword::Try.*?;)
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2200.
t/plugin-skt.t ..................
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlUseStatement>(?<PerlWrapperUseStatement_001>(?&PerlBabbleInnerMatch)|(?&PerlStdUseStatement)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>use\s+feature\s+.*?;)
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2198.
t/plugin-state.t ................
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlExpression>(?<PerlWrapperExpression_001>(?&PerlBabbleInnerMatch)|(?&PerlStdExpression)))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>(?>
(?&PerlSubstitution)
| (?&PerlTransliteration)
))
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2201.
t/plugin-substituteandreturn.t ..
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlSubroutineDeclaration>(?<PerlWrapperSubroutineDeclaration_001>((?&PerlStdSubroutineDeclaration))(?================================================================)))
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2196.
# Tests were run but no plan was declared and done_testing() was not seen.
# Looks like your test exited with 255 just after 1.
t/simple.t ......................
Dubious, test returned 255 (wstat 65280, 0xff00)
All 1 subtests passed
(?============================)* matches null string many times in regex; marked by <-- HERE in m/(?(DEFINE)
(?<PerlRolesList>(?<PerlStdRolesList>
(?&PerlQualifiedIdentifier)
(?: (?&PerlOWS) , (?&PerlOWS) (?&PerlQualifiedIdentifier) )*?
))
(?<PerlKeyword>(?<PerlWrapperKeyword_002>(?&PerlBabbleInnerMatch)|(?&PerlWrapperKeyword_001)))
(?<PerlWrapperKeyword_001>(?&PerlClassDef)|(?&PerlStdKeyword))
(?<PerlClassRoles>(?<PerlStdClassRoles>
with (?&PerlOWS) (?&PerlRolesList)
))
(?<PerlClassExtends>(?<PerlStdClassExtends>
extends (?&PerlOWS) (?&PerlQualifiedIdentifier)
))
(?<PerlClassDef>(?<PerlStdClassDef>
class (?&PerlOWS) (?&PerlQualifiedIdentifier)
(?: (?&PerlOWS) (?&PerlClassExtends) )?
(?: (?&PerlOWS) (?&PerlClassRoles) )?
(?&PerlOWS)
(?&PerlBlock)
))
(?<PerlBabbleInnerMatch>(?<PerlWrapperBabbleInnerMatch_001>((?&PerlStdBabbleInnerMatch))(?================================================================)))
(?<PerlStdBabbleInnerMatch>class(?&PerlOWS)(?&PerlQualifiedIdentifier)(?: (?&PerlOWS) (?&PerlClassExtends) )?(?: (?&PerlOWS) (?&PerlClassRoles) )?(?&PerlOWS)(?&PerlBlock))
) (?^umsx:
(?(DEFINE)
(?<PerlEntireDocument> (?<PerlStdEntireDocument>
\A
(?&PerlDocument)
(?:
\Z
|
(?(?===========================)
(?>(?&PerlOWSOrEND)) (?=======) ([^\n]++)
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlDocument> (?<PerlStdDocument>
\x{FEFF}?+ # Optional BOM marker
(?&PerlStatementSequence)
(?&PerlOWSOrEND)
)) # End of rule
(?<PerlStatementSequence> (?<PerlStdStatementSequence>
(?>(?&PerlPodSequence))
(?:
(?&PerlStatement)
(?&PerlPodSequence)
)*+
)) # End of rule
(?<PerlStatement> (?<PerlStdStatement>
(?>
(?>(?&PerlPodSequence))
(?: (?>(?&PerlLabel)) (?&PerlOWSOrEND) )?+
(?>(?&PerlPodSequence))
(?>
(?&PerlKeyword)
|
(?&PerlSubroutineDeclaration)
|
(?&PerlUseStatement)
|
(?&PerlPackageDeclaration)
|
(?&PerlControlBlock)
|
(?&PerlFormat)
|
(?>(?&PerlExpression)) (?>(?&PerlOWS))
(?&PerlStatementModifier)?+ (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
|
(?&PerlBlock)
|
;
)
| # A yada-yada...
\.\.\. (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just a label...
(?>(?&PerlLabel)) (?>(?&PerlOWSOrEND))
(?> ; | (?= \} | \z ))
| # Just an empty statement...
(?>(?&PerlOWS)) ;
| # An error (report it, if it's the first)...
(?(?===========================)
(?> (?&PerlOWS) )
(?! (?: \} | \z ) )
(?=========)
( (?&PerlExpression) (?&PerlOWS) [^\n]++ | [^;\}]++ )
(?=======================================================================================)
(?!)
)
)
)) # End of rule
(?<PerlSubroutineDeclaration> (?<PerlStdSubroutineDeclaration>
(?>
(?: (?> my | our | state ) \b (?>(?&PerlOWS)) )?+
sub \b (?>(?&PerlOWS))
(?>(?&PerlOldQualifiedIdentifier)) (?&PerlOWS)
|
AUTOLOAD (?&PerlOWS)
|
DESTROY (?&PerlOWS)
)
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?> ; | (?&PerlBlock) )
)) # End of rule
(?<PerlSignature> (?<PerlStdSignature>
\(
(?>(?&PerlOWS))
(?&PerlParameterDeclaration)*+
\)
)) # End of rule
(?<PerlParameterDeclaration> (?<PerlStdParameterDeclaration>
(?:
\$ (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression)?+ (?>(?&PerlOWS)) )?+
|
(?&PerlVariableScalar) (?>(?&PerlOWS))
(?: = (?>(?&PerlOWS)) (?&PerlConditionalExpression) (?>(?&PerlOWS)) )?+
|
(?&PerlVariableArray) (?>(?&PerlOWS))
|
(?&PerlVariableHash) (?>(?&PerlOWS))
)
(?: , (?>(?&PerlOWS)) | (?= \) ) ) # (
)) # End of rule
(?<PerlUseStatement> (?<PerlStdUseStatement>
(?: use | no ) (?>(?&PerlNWS))
(?>
(?&PerlVersionNumber)
|
(?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber)
(?! (?>(?&PerlOWS)) (?> (?&PerlInfixBinaryOperator) | (?&PerlComma) | \? ) )
)?+
(?: (?>(?&PerlNWS)) (?&PerlPodSequence) )?+
(?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlReturnExpression> (?<PerlStdReturnExpression>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
)) # End of rule
(?<PerlReturnStatement> (?<PerlStdReturnStatement>
return \b (?: (?>(?&PerlOWS)) (?&PerlExpression) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?= \} | \z ))
)) # End of rule
(?<PerlPackageDeclaration> (?<PerlStdPackageDeclaration>
package
(?>(?&PerlNWS)) (?>(?&PerlQualifiedIdentifier))
(?: (?>(?&PerlNWS)) (?&PerlVersionNumber) )?+
(?>(?&PerlOWSOrEND)) (?> ; | (?&PerlBlock) | (?= \} | \z ))
)) # End of rule
(?<PerlExpression> (?<PerlStdExpression>
(?>(?&PerlLowPrecedenceNotExpression))
(?: (?>(?&PerlOWS)) (?>(?&PerlLowPrecedenceInfixOperator))
(?>(?&PerlOWS)) (?&PerlLowPrecedenceNotExpression) )*+
)) # End of rule
(?<PerlLowPrecedenceNotExpression> (?<PerlStdLowPrecedenceNotExpression>
(?: not \b (?&PerlOWS) )*+ (?&PerlCommaList)
)) # End of rule
(?<PerlCommaList> (?<PerlStdCommaList>
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
(?:
(?: (?>(?&PerlComma)) (?&PerlOWS) )++
(?>(?&PerlAssignment)) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWSOrEND) )*+
)) # End of rule
(?<PerlAssignment> (?<PerlStdAssignment>
(?>(?&PerlConditionalExpression))
(?:
(?>(?&PerlOWS)) (?>(?&PerlAssignmentOperator))
(?>(?&PerlOWS)) (?&PerlConditionalExpression)
)*+
)) # End of rule
(?<PerlScalarExpression> (?<PerlStdScalarExpression>
(?<PerlConditionalExpression> (?<PerlStdConditionalExpression>
(?>(?&PerlBinaryExpression))
(?:
(?>(?&PerlOWS)) \? (?>(?&PerlOWS)) (?>(?&PerlAssignment))
(?>(?&PerlOWS)) : (?>(?&PerlOWS)) (?&PerlConditionalExpression)
)?+
)) # End of rule
)) # End of rule
(?<PerlBinaryExpression> (?<PerlStdBinaryExpression>
(?>(?&PerlPrefixPostfixTerm))
(?: (?>(?&PerlOWS)) (?>(?&PerlInfixBinaryOperator))
(?>(?&PerlOWS)) (?&PerlPrefixPostfixTerm) )*+
)) # End of rule
(?<PerlPrefixPostfixTerm> (?<PerlStdPrefixPostfixTerm>
(?: (?>(?&PerlPrefixUnaryOperator)) (?&PerlOWS) )*+
(?>(?&PerlTerm))
(?: (?>(?&PerlOWS)) (?&PerlPostfixUnaryOperator) )?+
)) # End of rule
(?<PerlLvalue> (?<PerlStdLvalue>
(?>
\\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier)
|
\( (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
(?:
(?>(?&PerlComma)) (?>(?&PerlOWS))
(?> \\?+ [\$\@%] (?>(?&PerlOWS)) (?&PerlIdentifier) | undef ) (?>(?&PerlOWS))
)*+
(?: (?>(?&PerlComma)) (?&PerlOWS) )?+
\)
)
)) # End of rule
(?<PerlTerm> (?<PerlStdTerm>
(?>
(?&PerlReturnExpression)
# The remaining alternatives can all take postfix dereferencers...
| (?:
(?= \$ ) (?&PerlScalarAccess)
|
(?= \@ ) (?&PerlArrayAccess)
|
(?= % ) (?&PerlHashAccess)
|
(?&PerlAnonymousSubroutine)
|
(?>(?&PerlNullaryBuiltinFunction)) (?! (?>(?&PerlOWS)) \( )
|
(?&PerlDoBlock) | (?&PerlEvalBlock)
|
(?&PerlCall)
|
(?&PerlVariableDeclaration)
|
(?&PerlTypeglob)
|
(?>(?&PerlParenthesesList))
# Can optionally do a [...] lookup straight after the parens,
# followd by any number of other look-ups
(?:
(?>(?&PerlOWS)) (?&PerlArrayIndexer)
(?:
(?>(?&PerlOWS))
(?>
(?&PerlArrayIndexer)
| (?&PerlHashIndexer)
| (?&PerlParenthesesList)
)
)*+
)?+
|
(?&PerlAnonymousArray)
|
(?&PerlAnonymousHash)
|
(?&PerlDiamondOperator)
|
(?&PerlContextualMatch)
|
(?&PerlQuotelikeS)
|
(?&PerlQuotelikeTR)
|
(?&PerlQuotelikeQX)
|
(?&PerlLiteral)
)
(?: (?&PerlTermPostfixDereference) )?+
)
)) # End of rule
(?<PerlTermPostfixDereference> (?<PerlStdTermPostfixDereference>
# Must have at least one arrowed dereference...
(?:
(?>(?&PerlOWS)) -> (?>(?&PerlOWS))
(?>
# A series of simple brackets can omit interstitial arrows...
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
(?:
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
| # A method call...
(?> (?&PerlQualifiedIdentifier) | (?! \$\#\* ) (?&PerlVariableScalar) )
(?: (?>(?&PerlOWS)) (?&PerlParenthesesList) )?+
| # An array or hash slice or k/v slice
# (provided it's not subsequently dereferenced)
[\@%] (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\@%]?+ [\[\{] )
| # An array max-index lookup...
\$\#\*
| # A scalar-, glob-, or subroutine dereference...
[\$*&] \*
| # An array dereference (provided it's not subsequently dereferenced)...
\@\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\[\@] )
| # A hash dereference (provided it's not subsequently dereferenced)...
\%\*
(?! (?>(?&PerlOWS)) -> (?>(?&PerlOWS)) [\{%] )
| # A glob lookup...
\* (?&PerlHashIndexer)
)
)++
)) # End of rule
(?<PerlControlBlock> (?<PerlStdControlBlock>
(?> # Conditionals...
(?> if | unless ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
elsif \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
)*+
(?:
(?>(?&PerlOWS))
(?>(?&PerlPodSequence))
else \b (?>(?&PerlOWS))
(?&PerlBlock)
)?+
| # Loops...
(?>
for(?:each)?+ \b
(?>(?&PerlOWS))
(?:
(?> # Explicitly aliased iterator variable...
(?> \\ (?>(?&PerlOWS)) (?> my | our | state )
| (?> my | our | state ) (?>(?&PerlOWS)) \\
)
(?>(?&PerlOWS))
(?> (?&PerlVariableScalar)
| (?&PerlVariableArray)
| (?&PerlVariableHash)
)
|
# List of scalar iterator variables...
my (?>(?&PerlOWS))
\( (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
(?: , (?>(?&PerlOWS))
(?>(?&PerlVariableScalar)) (?>(?&PerlOWS))
)*+
(?: , (?>(?&PerlOWS)) )?+
\)
|
# Implicitly aliased iterator variable...
(?> (?: my | our | state ) (?>(?&PerlOWS)) )?+
(?&PerlVariableScalar)
)?+
(?>(?&PerlOWS))
(?> (?&PerlParenthesesList) | (?&PerlQuotelikeQW) )
|
(?&PPR_X_three_part_list)
)
|
(?> while | until) \b (?>(?&PerlOWS))
(?&PerlParenthesesList)
)
(?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS)) continue
(?>(?&PerlOWS)) (?&PerlBlock)
)?+
| # Phasers...
(?> BEGIN | END | CHECK | INIT | UNITCHECK ) \b (?>(?&PerlOWS))
(?&PerlBlock)
| # Try/catch/finallys...
(?>(?&PerlTryCatchFinallyBlock))
| # Defers...
defer (?>(?&PerlOWS))
(?&PerlBlock)
| # Switches...
(?> given | when ) \b (?>(?&PerlOWS))
(?>(?&PerlParenthesesList)) (?>(?&PerlOWS))
(?&PerlBlock)
|
default (?>(?&PerlOWS))
(?&PerlBlock)
)
)) # End of rule
(?<PerlFormat> (?<PerlStdFormat>
format
(?: (?>(?&PerlNWS)) (?&PerlQualifiedIdentifier) )?+
(?>(?&PerlOWS)) = [^\n]*+
(?&PPR_X_newline_and_heredoc)
(?:
(?! \. \n )
[^\n\$\@]*+
(?:
(?>
(?= \$ (?! \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s ) ) (?&PerlArrayAccessNoSpace)
)
[^\n\$\@]*+
)*+
(?&PPR_X_newline_and_heredoc)
)*+
\. (?&PerlEndOfLine)
)) # End of rule
(?<PerlStatementModifier> (?<PerlStdStatementModifier>
(?> if | for(?:each)?+ | while | unless | until | when )
\b
(?>(?&PerlOWS))
(?&PerlExpression)
)) # End of rule
(?<PerlBlock> (?<PerlStdBlock>
\{ (?>(?&PerlStatementSequence)) \}
)) # End of rule
(?<PerlCall> (?<PerlStdCall>
(?>
[&] (?>(?&PerlOWS))
(?> (?&PerlBlock)
| (?&PerlVariableScalar)
| (?&PerlQualifiedIdentifier)
) (?>(?&PerlOWS))
(?:
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
)?+
|
- (?>(?&PPR_X_filetest_name)) (?>(?&PerlOWS))
(?&PerlPrefixPostfixTerm)?+
|
(?>(?&PerlBuiltinFunction)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?>
(?= (?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlExpression)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlExpression)
|
(?&PerlExpression)?+
) (?>(?&PerlOWS))
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?>(?&PerlNWS))
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
|
(?>(?&PPR_X_non_reserved_identifier)) (?>(?&PerlOWS))
(?>
\( (?>(?&PerlOWS))
(?: (?>(?&PerlExpression)) (?&PerlOWS) )?+
\)
|
(?>
(?=
(?>(?&PPR_X_non_reserved_identifier))
(?>(?&PerlOWS))
(?! \( | (?&PerlComma) )
)
(?&PerlCall)
|
(?>(?&PerlBlock)) (?>(?&PerlOWS))
(?&PerlCommaList)?+
|
(?>(?&PPR_X_indirect_obj)) (?&PerlNWS)
(?&PerlCommaList)
|
(?&PerlCommaList)?+
)
)
)
)) # End of rule
(?<PerlVariableDeclaration> (?<PerlStdVariableDeclaration>
(?> my | our | state ) \b (?>(?&PerlOWS))
(?: (?&PerlQualifiedIdentifier) (?&PerlOWS) )?+
(?>(?&PerlLvalue)) (?>(?&PerlOWS))
(?&PerlAttributes)?+
)) # End of rule
(?<PerlDoBlock> (?<PerlStdDoBlock>
do (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlEvalBlock> (?<PerlStdEvalBlock>
eval (?>(?&PerlOWS)) (?&PerlBlock)
)) # End of rule
(?<PerlTryCatchFinallyBlock> (?<PerlStdTryCatchFinallyBlock>
try \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?>(?&PerlOWS))
catch \b (?>(?&PerlOWS))
\( (?>(?&PerlVariableScalar)) \) (?>(?&PerlOWS))
(?>(?&PerlBlock))
(?:
(?>(?&PerlOWS))
finally \b (?>(?&PerlOWS))
(?>(?&PerlBlock))
)?+
)) # End of rule
(?<PerlAttributes> (?<PerlStdAttributes>
:
(?>(?&PerlOWS))
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
(?:
(?> (?>(?&PerlOWS)) : (?&PerlOWS) | (?&PerlNWS) )
(?>(?&PerlIdentifier))
(?:
(?= \( ) (?&PPR_X_quotelike_body)
)?+
)*+
)) # End of rule
(?<PerlList> (?<PerlStdList>
(?> (?&PerlParenthesesList) | (?&PerlCommaList) )
)) # End of rule
(?<PerlParenthesesList> (?<PerlStdParenthesesList>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \)
)) # End of rule
(?<PerlAnonymousArray> (?<PerlStdAnonymousArray>
\[ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \]
)) # End of rule
(?<PerlAnonymousHash> (?<PerlStdAnonymousHash>
\{ (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )?+ \}
)) # End of rule
(?<PerlArrayIndexer> (?<PerlStdArrayIndexer>
\[ (?>(?&PerlOWS))
(?>(?&PerlExpression)) (?>(?&PerlOWS))
\]
)) # End of rule
(?<PerlHashIndexer> (?<PerlStdHashIndexer>
\{ (?>(?&PerlOWS))
(?: -?+ (?&PerlIdentifier) | (?&PerlExpression) ) # (Note: MUST allow backtracking here)
(?>(?&PerlOWS))
\}
)) # End of rule
(?<PerlDiamondOperator> (?<PerlStdDiamondOperator>
<<>> # Perl 5.22 "double diamond"
|
< (?! < )
(?>(?&PPR_X_balanced_angles))
>
(?=
(?>(?&PerlOWSOrEND))
(?> \z | [,;\}\])?] | => | : (?! :) # (
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
(?<PerlComma> (?<PerlStdComma>
(?> , | => )
)) # End of rule
(?<PerlPrefixUnaryOperator> (?<PerlStdPrefixUnaryOperator>
(?> \+\+ | -- | [!\\+~] | - (?! (?&PPR_X_filetest_name) \b ) )
)) # End of rule
(?<PerlPostfixUnaryOperator> (?<PerlStdPostfixUnaryOperator>
(?> \+\+ | -- )
)) # End of rule
(?<PerlInfixBinaryOperator> (?<PerlStdInfixBinaryOperator>
(?> [=!][~=]
| cmp
| <= >?+
| >=
| [lg][te]
| eq
| ne
| [+] (?! [+=] )
| - (?! [-=] )
| [.]{2,3}+
| [.%x] (?! [=] )
| [&|^][.] (?! [=] )
| [<>*&|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~
| isa
)
)) # End of rule
(?<PerlAssignmentOperator> (?<PerlStdAssignmentOperator>
(?: [<>*&|/]{2}
| [-+.*/%x]
| [&|^][.]?+
)?+
=
(?! > )
)) # End of rule
(?<PerlLowPrecedenceInfixOperator> (?<PerlStdLowPrecedenceInfixOperator>
(?> or | and | xor )
)) # End of rule
(?<PerlAnonymousSubroutine> (?<PerlStdAnonymousSubroutine>
sub \b
(?>(?&PerlOWS))
(?:
# Perl pre 5.028
(?:
(?>
(?&PerlSignature) # Parameter list
|
\( [^)]*+ \) # Prototype (
)
(?&PerlOWS)
)?+
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
|
# Perl post 5.028
(?: (?>(?&PerlAttributes)) (?&PerlOWS) )?+
(?: (?>(?&PerlSignature)) (?&PerlOWS) )?+ # Parameter list
)
(?&PerlBlock)
)) # End of rule
(?<PerlVariable> (?<PerlStdVariable>
(?= [\$\@%] )
(?>
(?&PerlScalarAccess)
| (?&PerlHashAccess)
| (?&PerlArrayAccess)
)
(?> (?&PerlTermPostfixDereference) )?+
)) # End of rule
(?<PerlTypeglob> (?<PerlStdTypeglob>
\*
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
(?&PerlVariableScalar)
|
[][!"#\$%&'()*+,./:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccess> (?<PerlStdArrayAccess>
(?>(?&PerlVariableArray))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlArrayAccessNoSpace> (?<PerlStdArrayAccessNoSpace>
(?>(?&PerlVariableArrayNoSpace))
# Optional arrowless access(es) to begin
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any number of optional arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlArrayAccessNoSpaceNoArrow> (?<PerlStdArrayAccessNoSpaceNoArrow>
(?>(?&PerlVariableArray))
(?:
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )
)*+
)) # End of rule
(?<PerlHashAccess> (?<PerlStdHashAccess>
(?>(?&PerlVariableHash))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlScalarAccess> (?<PerlStdScalarAccess>
(?>(?&PerlVariableScalar))
# Optional arrowless access(es) to begin (but can't start with a parens)...
(?:
(?! (?>(?&PerlOWS)) \( )
(?:
(?>(?&PerlOWS))
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
# Note: subsequent arrowed postdereferences that would follow here
# are handled at the <PerlTerm> level
)) # End of rule
(?<PerlScalarAccessNoSpace> (?<PerlStdScalarAccessNoSpace>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) to begin...
(?: (?&PerlArrayIndexer) | (?&PerlHashIndexer) )*+
# Then any nuber of arrowed accesses
# (this is an inlined subset of (?&PerlTermPostfixDereference))...
(?:
->
(?>
# A series of simple brackets can omit interstitial arrows...
(?: (?&PerlArrayIndexer)
| (?&PerlHashIndexer)
)++
| # An array or hash slice...
\@ (?> (?>(?&PerlArrayIndexer)) | (?>(?&PerlHashIndexer)) )
)
)*+
# Followed by at most one of these terminal arrowed dereferences...
(?:
->
(?>
# An array or scalar deref...
[\@\$] \*
| # An array count deref...
\$ \# \*
)
)?+
)) # End of rule
(?<PerlScalarAccessNoSpaceNoArrow> (?<PerlStdScalarAccessNoSpaceNoArrow>
(?>(?&PerlVariableScalarNoSpace))
# Optional arrowless access(es) (but parens can't be first)...
(?:
(?! \( )
(?:
(?> (?&PerlArrayIndexer) | (?&PerlHashIndexer) | (?&PerlParenthesesList) )
)++
)?+
)) # End of rule
(?<PerlVariableScalar> (?<PerlStdVariableScalar>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
(?&PerlOWS)
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ [!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-] \}
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableScalarNoSpace> (?<PerlStdVariableScalarNoSpace>
\$\$
(?! [\$\{\w] )
|
(?:
\$
(?:
[#]
(?= (?> [\$^\w\{:+] | - (?! > ) ) )
)?+
)++
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
\{ \w++ \}
|
(?&PerlBlock)
)
|
\$\#
)) # End of rule
(?<PerlVariableArray> (?<PerlStdVariableArray>
\@ (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableArrayNoSpace> (?<PerlStdVariableArrayNoSpace>
\@
(?: \$ )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlVariableHash> (?<PerlStdVariableHash>
% (?>(?&PerlOWS))
(?: \$ (?&PerlOWS) )*+
(?>
\d++
|
\^ [][A-Z^_?\\]
|
\{ \^ [A-Z_] \w*+ \}
|
(?>(?&PerlOldQualifiedIdentifier)) (?: :: )?+
|
:: (?&PerlBlock)?+
|
[][!"#\$%&'()*+,.\\/:;<=>?\@\^`|~-]
|
(?&PerlBlock)
)
)) # End of rule
(?<PerlLabel> (?<PerlStdLabel>
(?! (?> [msy] | q[wrxq]?+ | tr ) \b )
(?>(?&PerlIdentifier))
: (?! : )
)) # End of rule
(?<PerlLiteral> (?<PerlStdLiteral>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlNumber)
| (?&PerlBareword)
)
)) # End of rule
(?<PerlString> (?<PerlStdString>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
(?: q \b | qq (?= (?>(?&PerlOWS)) ' ) )
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
|
qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
|
(?&PerlHeredoc)
|
(?&PerlVString)
)
)) # End of rule
(?<PerlQuotelike> (?<PerlStdQuotelike>
(?> (?&PerlString)
| (?&PerlQuotelikeQR)
| (?&PerlQuotelikeQW)
| (?&PerlQuotelikeQX)
| (?&PerlContextualMatch)
| (?&PerlQuotelikeS)
| (?&PerlQuotelikeTR)
)
)) # End of rule
(?<PerlHeredoc> (?<PerlStdHeredoc>
# Match the introducer...
<<
(?<_heredoc_indented> [~]?+ )
# Match the terminator specification...
(?>
\\?+ (?<_heredoc_terminator> (?&PerlIdentifier) )
|
(?>(?&PerlOWS))
(?>
" (?<_heredoc_terminator> [^"\\]*+ (?: \\. [^"\\]*+ )*+ ) " #"
|
(?<PPR_X_HD_nointerp> ' )
(?<_heredoc_terminator> [^'\\]*+ (?: \\. [^'\\]*+ )*+ ) ' #'
|
` (?<_heredoc_terminator> [^`\\]*+ (?: \\. [^`\\]*+ )*+ ) ` #`
)
|
(?<_heredoc_terminator> )
)
# Do we need to reset the heredoc cache???
(?====================================================================================================================================================================================================================================================================)
# Do we need to cache content lookahead for this heredoc???
(?(?==============================================================================================================================================================================)
# Lookahead to detect and remember trailing contents of heredoc
(?=
[^\n]*+ \n # Go to the end of the current line
(?==========) # Remember the start of the contents
(?==========================================) # Skip earlier heredoc contents
(?> # The heredoc contents consist of...
(?:
(?!
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The terminator
(?: \n | \z ) # At an end-of-line
)
(?(<PPR_X_HD_nointerp>)
[^\n]*+ \n
|
[^\n\$\@]*+
(?:
(?>
(?===========================================)
(?= \$ ) (?&PerlScalarAccess)
(?===============================)
|
(?===========================================)
(?= \@ ) (?&PerlArrayAccess)
(?===============================)
)
[^\n\$\@]*+
)*+
\n (?==========================================)
)
)*+
(?(?=========================) \h*+ ) # An indent (if it was a <<~)
\g{_heredoc_terminator} # The specified terminator
(?: \n | \z ) # Followed by EOL
)
# Then memoize the skip for when it's subsequently needed by PerlOWS or PerlNWS...
(?===============================================================================================================================================================================================================================================================================================================================================================================)
)
)
)) # End of rule
(?<PerlQuotelikeQ> (?<PerlStdQuotelikeQ>
(?>
' [^'\\]*+ (?: \\. [^'\\]*+ )*+ '
|
\b q \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQQ> (?<PerlStdQuotelikeQQ>
(?>
" [^"\\]*+ (?: \\. [^"\\]*+ )*+ "
|
\b qq \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)) # End of rule
(?<PerlQuotelikeQW> (?<PerlStdQuotelikeQW>
(?>
qw \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body)
)
)) # End of rule
(?<PerlQuotelikeQX> (?<PerlStdQuotelikeQX>
(?>
` [^`]*+ (?: \\. [^`]*+ )*+ `
|
qx
(?>
(?= (?>(?&PerlOWS)) ' )
(?&PPR_X_quotelike_body)
|
\b (?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?&PPR_X_quotelike_body_interpolated)
)
)
)) # End of rule
(?<PerlQuotelikeS> (?<PerlStdQuotelikeS>
(?<PerlSubstitution> (?<PerlStdSubstitution>
s \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{] # )
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_regex_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Single-quoted syntax...
(?= (?>(?&PerlOWS)) ' )
(?>(?&PPR_X_regex_body_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
|
# Delimited syntax...
(?>(?&PPR_X_regex_body_interpolated_unclosed))
(?&PPR_X_quotelike_s_e_check)
(?>(?&PPR_X_quotelike_body_interpolated))
)
[msixpodualgcern]*+
)) # End of rule
)) # End of rule
(?<PerlQuotelikeTR> (?<PerlStdQuotelikeTR>
(?<PerlTransliteration> (?<PerlStdTransliteration>
(?> tr | y ) \b
(?! (?>(?&PerlOWS)) => )
(?>
# Hashed syntax...
(?= [#] )
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
|
# Bracketed syntax...
(?= (?>(?&PerlOWS))
(?: [\[(<\{\«] # )]
| (\X) (?======================================================)
)
)
(?>(?&PPR_X_quotelike_body_interpolated))
(?>(?&PerlOWS))
(?&PPR_X_quotelike_body_interpolated)
|
# Delimited syntax...
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
(?&PPR_X_quotelike_body_interpolated)
)
[cdsr]*+
)) # End of rule
)) # End of rule
(?<PerlContextualQuotelikeM> (?<PerlStdContextualQuotelikeM>
(?<PerlContextualMatch> (?<PerlStdContextualMatch>
(?<PerlQuotelikeM>
(?<PerlMatch>
(?>
\/\/
|
(?>
m (?= [#] )
|
m \b
(?! (?>(?&PerlOWS)) => )
|
(?= \/ [^/] )
)
(?&PPR_X_regex_body_interpolated)
)
[msixpodualgcn]*+
) # End of rule (?<PerlMatch>)
) # End of rule (?<PerlQuotelikeM>)
(?=
(?>(?&PerlOWS))
(?> \z | [,;\}\])?] | => | : (?! :)
| (?&PerlInfixBinaryOperator) | (?&PerlLowPrecedenceInfixOperator)
| (?= \w) (?> for(?:each)?+ | while | if | unless | until | when )
)
)
)) # End of rule
)) # End of rule
(?<PerlQuotelikeQR> (?<PerlStdQuotelikeQR>
qr \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
(?>(?&PPR_X_regex_body_interpolated))
[msixpodualn]*+
)) # End of rule
(?<PerlRegex> (?<PerlStdRegex>
(?>
(?&PerlMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlContextualRegex> (?<PerlStdContextualRegex>
(?>
(?&PerlContextualMatch)
|
(?&PerlQuotelikeQR)
)
)) # End of rule
(?<PerlBuiltinFunction> (?<PerlStdBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?=[^\W\d]) # Skip if possible
(?>
s(?>e(?>t(?>(?>(?>(?>hos|ne)t|gr)en|s(?>erven|ockop))t|p(?>r(?>iority|otoent)|went|grp))|m(?>ctl|get|op)|ek(?>dir)?|lect|nd)|y(?>s(?>write|call|open|read|seek|tem)|mlink)|h(?>m(?>write|read|ctl|get)|utdown|ift)|o(?>cket(?>pair)?|rt)|p(?>li(?>ce|t)|rintf)|(?>cala|ubst)r|t(?>at|udy)|leep|rand|qrt|ay|in)
| g(?>et(?>p(?>r(?>oto(?>byn(?>umber|ame)|ent)|iority)|w(?>ent|nam|uid)|eername|grp|pid)|s(?>erv(?>by(?>name|port)|ent)|ock(?>name|opt))|host(?>by(?>addr|name)|ent)|net(?>by(?>addr|name)|ent)|gr(?>ent|gid|nam)|login|c)|mtime|lob|oto|rep)
| r(?>e(?>ad(?>lin[ek]|pipe|dir)?|(?>quir|vers|nam)e|winddir|turn|set|cv|do|f)|index|mdir|and)
| c(?>h(?>o(?>m?p|wn)|r(?>oot)?|dir|mod)|o(?>n(?>tinue|nect)|s)|lose(?>dir)?|aller|rypt)
| e(?>nd(?>(?>hos|ne)t|p(?>roto|w)|serv|gr)ent|x(?>i(?>sts|t)|ec|p)|ach|val(?>bytes)?+|of)
| l(?>o(?>c(?>al(?>time)?|k)|g)|i(?>sten|nk)|(?>sta|as)t|c(?>first)?|ength)
| u(?>n(?>(?>lin|pac)k|shift|def|tie)|c(?>first)?|mask|time)
| p(?>r(?>ototype|intf?)|ack(?>age)?|o[ps]|ipe|ush)
| d(?>bm(?>close|open)|e(?>fined|lete)|ump|ie|o)
| f(?>or(?>m(?>line|at)|k)|ileno|cntl|c|lock)
| t(?>i(?>mes?|ed?)|ell(?>dir)?|runcate)
| w(?>a(?>it(?>pid)?|ntarray|rn)|rite)
| m(?>sg(?>ctl|get|rcv|snd)|kdir|ap)
| b(?>in(?>mode|d)|less|reak)
| i(?>n(?>dex|t)|mport|octl)
| a(?>ccept|larm|tan2|bs)
| o(?>pen(?>dir)?|ct|rd)
| v(?>alues|ec)
| k(?>eys|ill)
| quotemeta
| join
| next
| hex
| _
)
\b
)) # End of rule
(?<PerlNullaryBuiltinFunction> (?<PerlStdNullaryBuiltinFunction>
# Optimized to match any Perl builtin name, without backtracking...
(?= [^\W\d] ) # Skip if possible
(?>
get(?:(?:(?:hos|ne)t|serv|gr)ent|p(?:(?:roto|w)ent|pid)|login)
| end(?:(?:hos|ne)t|p(?:roto|w)|serv|gr)ent
| wa(?:ntarray|it)
| times?
| fork
| _
)
\b
)) # End of rule
(?<PerlVersionNumber> (?<PerlStdVersionNumber>
(?>
(?&PerlVString)
|
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )*+
)
)) # End of rule
(?<PerlVString> (?<PerlStdVString>
v (?>(?&PPR_X_digit_seq)) (?: \. (?&PPR_X_digit_seq) )*+
)) # End of rule
(?<PerlNumber> (?<PerlStdNumber>
[+-]?+
(?>
0 (?> x (?&PPR_X_x_digit_seq)
| b (?&PPR_X_b_digit_seq)
| o? (?&PPR_X_o_digit_seq)
)
|
(?>
(?>(?&PPR_X_digit_seq))
(?: \. (?&PPR_X_digit_seq)?+ )?+
|
\. (?&PPR_X_digit_seq)
)
(?: [eE] [+-]?+ (?&PPR_X_digit_seq) )?+
)
)) # End of rule
(?<PerlOldQualifiedIdentifier> (?<PerlStdOldQualifiedIdentifier>
(?> (?> :: | ' ) \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlQualifiedIdentifier> (?<PerlStdQualifiedIdentifier>
(?> :: \w++ | [^\W\d]\w*+ ) (?: (?> :: | ' ) \w++ )*+
)) # End of rule
(?<PerlIdentifier> (?<PerlStdIdentifier>
[^\W\d]\w*+
)) # End of rule
(?<PerlBareword> (?<PerlStdBareword>
(?! (?> (?= \w )
(?> for(?:each)?+ | while | if | unless | until | use | no
| given | when | sub | return | my | our | state
| try | catch | finally | defer
)
| (?&PPR_X_named_op)
| __ (?> END | DATA ) __ \b
) \b
(?! (?>(?&PerlOWS)) => )
)
(?! (?> q[qwrx]?+ | [mys] | tr ) \b
(?> (?= [#] ) | (?! (?>(?&PerlOWS)) => ) )
)
(?: :: )?+
[^\W\d]\w*+
(?: (?: :: | ' ) [^\W\d]\w*+ )*+
(?: :: )?+
(?! \( ) # )
|
:: (?! \w | \{ )
)) # End of rule
(?<PerlKeyword> (?<PerlStdKeyword>
(?!) # None, by default, but can be overridden in a composing regex
)) # End of rule
(?<PerlPodSequence> (?<PerlStdPodSequence>
(?>(?&PerlOWS)) (?: (?>(?&PerlPod)) (?&PerlOWS) )*+
)) # End of rule
(?<PerlPod> (?<PerlStdPod>
^ = [^\W\d]\w*+ # A line starting with =<identifier>
.*? # Up to the first...
(?>
^ = cut \b [^\n]*+ $ # ...line starting with =cut
| # or
\z # ...EOF
)
)) # End of rule
##### Whitespace matching (part of API) #################################
(?<PerlOWSOrEND> (?<PerlStdOWSOrEND>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
|
__ (?> END | DATA ) __ \b .*+ \z
)*+
)) # End of rule
(?<PerlOWS> (?<PerlStdOWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)*+
)) # End of rule
(?<PerlNWS> (?<PerlStdNWS>
(?:
\h++
|
(?&PPR_X_newline_and_heredoc)
|
[#] [^\n]*+
)++
)) # End of rule
(?<PerlEndOfLine> (?<PerlStdEndOfLine>
\n
)) # End of rule
###### Internal components (not part of API) ##########################
(?<PPR_X_named_op>
(?> cmp
| [lg][te]
| eq
| ne
| and
| or
| xor
)
) # End of rule (?<PPR_X_named_op>)
(?<PPR_X_non_reserved_identifier>
(?! (?>
for(?:each)?+ | while | if | unless | until | given | when | default
| sub | format | use | no | my | our | state
| try | catch | finally | defer
| (?&PPR_X_named_op)
| [msy] | q[wrxq]?+ | tr
| __ (?> END | DATA ) __
)
\b
)
(?>(?&PerlQualifiedIdentifier))
(?! :: )
) # End of rule (?<PPR_X_non_reserved_identifier>)
(?<PPR_X_three_part_list>
\( (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
; (?>(?&PerlOWS)) (?: (?>(?&PerlExpression)) (?&PerlOWS) )??
\)
) # End of rule (?<PPR_X_three_part_list>)
(?<PPR_X_indirect_obj>
(?&PerlBareword)
|
(?>(?&PerlVariableScalar))
(?! (?>(?&PerlOWS)) (?> [<\[\{] | -> ) )
) # End of rule (?<PPR_X_indirect_obj>)
(?<PPR_X_quotelike_body>
(?>(?&PPR_X_quotelike_body_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body>)
(?<PPR_X_balanced_parens>
[^)(\\\n]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens)) \)
|
(?&PPR_X_newline_and_heredoc)
)
[^)(\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_parens>)
(?<PPR_X_balanced_curlies>
[^\}\{\\\n]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies)) \}
|
(?&PPR_X_newline_and_heredoc)
)
[^\}\{\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies>)
(?<PPR_X_balanced_squares>
[^][\\\n]*+
(?:
(?>
\\.
|
\[ (?&PPR_X_balanced_squares) \]
|
(?&PPR_X_newline_and_heredoc)
)
[^][\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_squares>)
(?<PPR_X_balanced_angles>
[^><\\\n]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles)) >
|
(?&PPR_X_newline_and_heredoc)
)
[^><\\\n]*+
)*+
) # End of rule (?<PPR_X_balanced_angles>)
(?<PPR_X_balanced_unicode_delims>
(?============================)* <-- HERE +
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
)
(?============================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims>)
(?<PPR_X_regex_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>
\?{1,2}+ (?= \{ )
(?>(?&PerlBlock))
|
(?! \?{1,2}+ \{ )
(?>(?&PPR_X_balanced_parens))
) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_regex_body_unclosed>)
(?<PPR_X_quotelike_body_unclosed>
(?>
[#]
[^#\\\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^#\\\n]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims))
(?= (?======================) )
|
\\
[^\\\n]*+
(
(?&PPR_X_newline_and_heredoc)
[^\\\n]*+
)*+
(?= \\ )
|
/
[^\\/\n]*+
(?:
(?: \\. | (?&PPR_X_newline_and_heredoc) )
[^\\/\n]*+
)*+
(?= / )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} ) .
)*+
(?= \g{PPR_X_qldel} )
)
)
) # End of rule (?<PPR_X_quotelike_body_unclosed>)
(?<PPR_X_quotelike_body_interpolated>
(?>(?&PPR_X_quotelike_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_quotelike_body_interpolated>)
(?<PPR_X_regex_body_interpolated>
(?>(?&PPR_X_regex_body_interpolated_unclosed))
\S # (Note: Don't have to test that this matches; the preceding subrule already did that)
) # End of rule (?<PPR_X_regex_body_interpolated>)
(?<PPR_X_balanced_parens_regex_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_regex_interpolated>)
(?<PPR_X_balanced_curlies_regex_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_regex_interpolated>)
(?<PPR_X_balanced_squares_regex_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\](|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\](|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_regex_interpolated>)
(?<PPR_X_balanced_angles_regex_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>(|)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>(|)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_regex_interpolated>)
(?<PPR_X_balanced_unicode_delims_regex_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=======================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?========================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?===========================================) )
(?&PerlScalarAccessNoSpace)
|
(?= \$ (?===========================================) )
(?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_regex_interpolated>)
(?<PPR_X_balanced_parens_interpolated>
[^)(\\\n\$\@]*+
(?:
(?>
\\.
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) \)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\)] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\)] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^)(\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_parens_interpolated>)
(?<PPR_X_balanced_curlies_interpolated>
[^\}\{\\\n\$\@]*+
(?:
(?>
\\.
|
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) \}
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\}] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\}] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\}\{\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_curlies_interpolated>)
(?<PPR_X_balanced_squares_interpolated>
[^][\\\n\$\@]*+
(?:
(?>
\\.
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) \]
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\]] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\]] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^][\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_squares_interpolated>)
(?<PPR_X_balanced_unicode_delims_interpolated>
(?=====================================)*+
(?:
(?>
\\.
|
(?=====================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?======================)
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! \s | (?======================) ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \s | (?======================) ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
(?=====================================)*+
)*+
) # End of rule (?<PPR_X_balanced_unicode_delims_interpolated>)
(?<PPR_X_balanced_angles_interpolated>
[^><\\\n\$\@]*+
(?:
(?>
\\.
|
< (?>(?&PPR_X_balanced_angles_interpolated)) >
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s>] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s>] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^><\\\n\$\@]*+
)*+
) # End of rule (?<PPR_X_balanced_angles_interpolated>)
(?<PPR_X_regex_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_regex_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_regex_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_regex_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_regex_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_regex_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/|()] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s|()-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s|()-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | [\s|()] ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_regex_body_unclosed)
) # End of rule (?<PPR_X_regex_body_interpolated_unclosed>)
(?<PPR_X_quotelike_body_interpolated_unclosed>
# Start by working out where it actually ends (ignoring interpolations)...
(?=
(?>
[#]
[^#\\\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s#] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s#] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^#\\\n\$\@]*+
)*+
(?= [#] )
|
(?>(?&PerlOWS))
(?>
\{ (?>(?&PPR_X_balanced_curlies_interpolated)) (?= \} )
|
\[ (?>(?&PPR_X_balanced_squares_interpolated)) (?= \] )
|
\( (?>(?&PPR_X_balanced_parens_interpolated)) (?= \) )
|
< (?>(?&PPR_X_balanced_angles_interpolated)) (?= > )
|
(\X) (?======================================================)
(?=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================)
(?>(?&PPR_X_balanced_unicode_delims_interpolated))
(?= (?======================) )
|
'
[^'\n]*+
(?:
(?> (?&PPR_X_newline_and_heredoc))
[^'\n]*+
)*+
(?= ' )
|
\\
[^\\\n\$\@]*+
(?:
(?>
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s\\] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s\\] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\\n\$\@]*+
)*+
(?= \\ )
|
/
[^\\/\n\$\@]*+
(?:
(?>
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?= \$ (?! [\s/] ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! [\s/] ) ) (?&PerlArrayAccessNoSpace)
|
[\$\@]
)
[^\\/\n\$\@]*+
)*+
(?= / )
|
-
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?:
(?= \$ (?! [\s-] ) ) (?&PerlScalarAccessNoSpaceNoArrow)
|
(?= \@ (?! [\s-] ) ) (?&PerlArrayAccessNoSpaceNoArrow)
|
[^-]
)
)*+
(?= - )
|
(?<PPR_X_qldel> \S )
(?:
\\.
|
(?&PPR_X_newline_and_heredoc)
|
(?! \g{PPR_X_qldel} )
(?:
(?= \$ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlScalarAccessNoSpace)
|
(?= \@ (?! \g{PPR_X_qldel} | \s ) ) (?&PerlArrayAccessNoSpace)
|
.
)
)*+
(?= \g{PPR_X_qldel} )
)
)
)
(?&PPR_X_quotelike_body_unclosed)
) # End of rule (?<PPR_X_quotelike_body_interpolated_unclosed>)
(?<PPR_X_quotelike_s_e_check>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body_interpolated)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check>)
(?<PPR_X_quotelike_s_e_check_uninterpolated>
(?=============================================)
(?:
(?=
(?&PPR_X_quotelike_body)
(?===========================================)
[msixpodualgcrn]*+ e [msixpodualgcern]*+
)
(?=
\S # Skip the left delimiter
(?(?==================================)
(?>
(?===============================================================)
(?>
(?&PerlExpression)
|
\\?+ .
)
)*+
)
)
)?+
) # End of rule (?<PPR_X_quotelike_s_e_check_uninterpolated>)
(?<PPR_X_filetest_name> [ABCMORSTWXbcdefgkloprstuwxz] )
(?<PPR_X_digit_seq> \d++ (?: _?+ \d++ )*+ )
(?<PPR_X_x_digit_seq> [\da-fA-F]++ (?: _?+ [\da-fA-F]++ )*+ )
(?<PPR_X_o_digit_seq> [0-7]++ (?: _?+ [0-7]++ )*+ )
(?<PPR_X_b_digit_seq> [0-1]++ (?: _?+ [0-1]++ )*+ )
(?<PPR_X_newline_and_heredoc>
\n (?===================================================================================================)
) # End of rule (?<PPR_X_newline_and_heredoc>)
)
# END OF GRAMMAR
)/ at (eval 37) line 2216.
t/submatch-rule.t ...............
Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run
Test Summary Report
-------------------
t/plugin-coresignatures.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-definedor.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-ellipsis.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-packageblock.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-packageversion.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-postfixderef.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-sigify.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-skt.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-state.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-substituteandreturn.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/simple.t (Wstat: 65280 Tests: 1 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/submatch-rule.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
Files=12, Tests=1, 22 wallclock secs ( 0.10 usr 0.02 sys + 6.44 cusr 0.53 csys = 7.09 CPU)
Result: FAIL
------------------------------
PREREQUISITES
------------------------------
Prerequisite modules loaded:
requires:
Module Need Have
------------------- -------- --------
List::Util 1.45 1.63
Module::Runtime 0 0.016
Moo 2 2.005004
Mu 0 1.191300
PPR 0.001004 0.001004
strictures 2 2.000006
configure_requires:
Module Need Have
------------------- -------- --------
Module::Build::Tiny 0.034 0.039
------------------------------
ENVIRONMENT AND OTHER CONTEXT
------------------------------
Environment variables:
AUTOMATED_TESTING = 1
LANG = en_GB.UTF-8
LANGUAGE = en_GB:en
LC_TERMINAL = iTerm2
LC_TERMINAL_VERSION = 3.4.16
NONINTERACTIVE_TESTING = 1
PATH = /home/david/perl5/perlbrew/bin:/home/david/perl5/perlbrew/perls/perl-5.32.0/bin:/home/david/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PERL = 5.32.0
PERL5LIB =
PERL5OPT =
PERL5_CPANPLUS_IS_RUNNING = 21356
PERL5_CPAN_IS_RUNNING = 21356
PERLBREW_HOME = /home/david/.perlbrew
PERLBREW_MANPATH = /home/david/perl5/perlbrew/perls/perl-5.32.0/man
PERLBREW_PATH = /home/david/perl5/perlbrew/bin:/home/david/perl5/perlbrew/perls/perl-5.32.0/bin
PERLBREW_PERL = perl-5.32.0
PERLBREW_ROOT = /home/david/perl5/perlbrew
PERLBREW_SHELLRC_VERSION = 0.89
PERLBREW_VERSION = 0.89
PERLVER = 5.32.0
PERL_INLINE_DIRECTORY = /home/david/.Inline-5.32.0
PERL_MM_USE_DEFAULT = 1
PERL_USE_UNSAFE_INC = 0
SHELL = /bin/bash
TERM = screen
Perl special variables (and OS-specific diagnostics, for MSWin32):
$^X = /home/david/cpantesting/perl-5.32.0/bin/perl
$UID/$EUID = 1000 / 1000
$GID = 1000 24 25 27 29 30 44 46 109 1000
$EGID = 1000 24 25 27 29 30 44 46 109 1000
Perl module toolchain versions installed:
Module Have
------------------- --------
CPAN 2.27
CPAN::Meta 2.150010
Cwd 3.78
ExtUtils::CBuilder 0.280234
ExtUtils::Command 7.64
ExtUtils::Install 2.14
ExtUtils::MakeMaker 7.64
ExtUtils::Manifest 1.72
ExtUtils::ParseXS 3.40
File::Spec 3.78
JSON 4.09
JSON::PP 4.04
Module::Build 0.4231
Module::Signature n/a
Parse::CPAN::Meta 2.150010
Test::Harness 3.42
Test::More 1.302191
YAML 1.30
YAML::Syck n/a
version 0.9924
--
Summary of my perl5 (revision 5 version 32 subversion 0) configuration:
Platform:
osname=linux
osvers=5.10.0-11-686-pae
archname=i686-linux
uname='linux cpantesting-linux-32bit-utm 5.10.0-11-686-pae #1 smp debian 5.10.92-1 (2022-01-18) i686 gnulinux '
config_args='-de -Dprefix=/home/david/cpantesting/perl-5.32.0'
hint=recommended
useposix=true
d_sigaction=define
useithreads=undef
usemultiplicity=undef
use64bitint=undef
use64bitall=undef
uselongdouble=undef
usemymalloc=n
default_inc_excludes_dot=define
bincompat5005=undef
Compiler:
cc='cc'
ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
optimize='-O2'
cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
ccversion=''
gccversion='10.2.1 20210110'
gccosandvers=''
intsize=4
longsize=4
ptrsize=4
doublesize=8
byteorder=1234
doublekind=3
d_longlong=define
longlongsize=8
d_longdbl=define
longdblsize=12
longdblkind=3
ivtype='long'
ivsize=4
nvtype='double'
nvsize=8
Off_t='off_t'
lseeksize=8
alignbytes=4
prototype=define
Linker and Libraries:
ld='cc'
ldflags =' -fstack-protector-strong -L/usr/local/lib'
libpth=/usr/local/lib /usr/include/i386-linux-gnu /usr/lib /lib/i386-linux-gnu /lib/../lib /usr/lib/i386-linux-gnu /usr/lib/../lib /lib /lib64 /usr/lib64
libs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
libc=libc-2.31.so
so=so
useshrplib=false
libperl=libperl.a
gnulibc_version='2.31'
Dynamic Linking:
dlsrc=dl_dlopen.xs
dlext=so
d_dlsymun=undef
ccdlflags='-Wl,-E'
cccdlflags='-fPIC'
lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong'
Characteristics of this binary (from libperl):
Compile-time options:
HAS_TIMES
PERLIO_LAYERS
PERL_COPY_ON_WRITE
PERL_DONT_CREATE_GVSV
PERL_MALLOC_WRAP
PERL_OP_PARENT
PERL_PRESERVE_IVUV
USE_LARGE_FILES
USE_LOCALE
USE_LOCALE_COLLATE
USE_LOCALE_CTYPE
USE_LOCALE_NUMERIC
USE_LOCALE_TIME
USE_PERLIO
USE_PERL_ATOF
Built under linux
Compiled at Feb 7 2022 22:58:14
%ENV:
PERL="5.32.0"
PERL5LIB=""
PERL5OPT=""
PERL5_CPANPLUS_IS_RUNNING="21356"
PERL5_CPAN_IS_RUNNING="21356"
PERLBREW_HOME="/home/david/.perlbrew"
PERLBREW_MANPATH="/home/david/perl5/perlbrew/perls/perl-5.32.0/man"
PERLBREW_PATH="/home/david/perl5/perlbrew/bin:/home/david/perl5/perlbrew/perls/perl-5.32.0/bin"
PERLBREW_PERL="perl-5.32.0"
PERLBREW_ROOT="/home/david/perl5/perlbrew"
PERLBREW_SHELLRC_VERSION="0.89"
PERLBREW_VERSION="0.89"
PERLVER="5.32.0"
PERL_INLINE_DIRECTORY="/home/david/.Inline-5.32.0"
PERL_MM_USE_DEFAULT="1"
PERL_USE_UNSAFE_INC="0"
@INC:
/home/david/cpantesting/perl-5.32.0/lib/site_perl/5.32.0/i686-linux
/home/david/cpantesting/perl-5.32.0/lib/site_perl/5.32.0
/home/david/cpantesting/perl-5.32.0/lib/5.32.0/i686-linux
/home/david/cpantesting/perl-5.32.0/lib/5.32.0