Babble v0.090007_01 Perl 5 v5.36.0 x86_64-linux-thread-multi
- Status
- Fail
- From
- Andreas J. König (ANDK)
- Dist
-
Babble v0.090007_01
- Platform
- Perl 5 v5.36.0 x86_64-linux-thread-multi
- Date
- 2022-09-04 20:05:36
- ID
- f08d5a98-2c8c-11ed-99e9-db6de5deb7e4
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.36.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 33) 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 33) 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 33) 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 33) 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 33) 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 33) 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 33) 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 33) 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 33) 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 33) 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 33) 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 33) 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 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-definedor.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-ellipsis.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-packageblock.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-packageversion.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-postfixderef.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-sigify.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-skt.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-state.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/plugin-substituteandreturn.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/simple.t (Wstat: 65280 (exited 255) Tests: 1 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
t/submatch-rule.t (Wstat: 65280 (exited 255) Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
Files=12, Tests=1, 6 wallclock secs ( 0.05 usr 0.02 sys + 4.45 cusr 0.44 csys = 4.96 CPU)
Result: FAIL
------------------------------
PREREQUISITES
------------------------------
Prerequisite modules loaded:
requires:
Module Need Have
------------------- -------- --------
List::Util 1.45 1.62
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_US.UTF-8
LANGUAGE = en_US:en
PATH = /home/sand/bin:/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/perl/bin:/usr/X11/bin:/sbin:/usr/sbin
PERL5LIB = /tmp/loop_over_bdir-30477-_WnfOT/PPR-0.001004-0/blib/arch:/tmp/loop_over_bdir-30477-_WnfOT/PPR-0.001004-0/blib/lib:/tmp/loop_over_bdir-30477-_WnfOT/Mu-1.191300-0/blib/arch:/tmp/loop_over_bdir-30477-_WnfOT/Mu-1.191300-0/blib/lib:/tmp/loop_over_bdir-30477-_WnfOT/MooX-ShortHas-1.202040-0/blib/arch:/tmp/loop_over_bdir-30477-_WnfOT/MooX-ShortHas-1.202040-0/blib/lib
PERL5OPT =
PERL5_CPANPLUS_IS_RUNNING = 10639
PERL5_CPAN_IS_RUNNING = 10639
PERL_CANARY_STABILITY_NOPROMPT = 1
PERL_MM_USE_DEFAULT = 1
PERL_USE_UNSAFE_INC = 1
SHELL = /usr/bin/zsh
TERM = screen
Perl special variables (and OS-specific diagnostics, for MSWin32):
$^X = /home/sand/src/perl/repoperls/installed-perls/host/k93stretch/v5.36.0/2cd7/bin/perl
$UID/$EUID = 1005 / 1005
$GID = 1005 1005
$EGID = 1005 1005
Perl module toolchain versions installed:
Module Have
------------------- --------
CPAN 2.34
CPAN::Meta 2.150010
Cwd 3.84
ExtUtils::CBuilder 0.280236
ExtUtils::Command 7.64
ExtUtils::Install 2.20
ExtUtils::MakeMaker 7.64
ExtUtils::Manifest 1.73
ExtUtils::ParseXS 3.45
File::Spec 3.84
JSON 4.06
JSON::PP 4.09
Module::Build 0.4231
Module::Signature 0.88
Parse::CPAN::Meta 2.150010
Test::Harness 3.44
Test::More 1.302190
YAML 1.30
YAML::Syck 1.34
version 0.9929
--
Summary of my perl5 (revision 5 version 36 subversion 0) configuration:
Commit id: b3c502b607191da0e743a4fa34501a05442305b3
Platform:
osname=linux
osvers=4.9.0-18-amd64
archname=x86_64-linux-thread-multi
uname='linux k93stretch 4.9.0-18-amd64 #1 smp debian 4.9.303-1 (2022-03-07) x86_64 gnulinux '
config_args='-Dprefix=/home/sand/src/perl/repoperls/installed-perls/host/k93stretch/v5.36.0/2cd7 -Dmyhostname=k93stretch -Dinstallusrbinperl=n -Uversiononly -Dusedevel -des -Ui_db -Dlibswanted=cl pthread socket inet nsl gdbm dbm malloc dl ld sun m crypt sec util c cposix posix ucb BSD gdbm_compat -Duseithreads -Uuselongdouble -DEBUGGING=both'
hint=recommended
useposix=true
d_sigaction=define
useithreads=define
usemultiplicity=define
use64bitint=define
use64bitall=define
uselongdouble=undef
usemymalloc=n
default_inc_excludes_dot=define
Compiler:
cc='cc'
ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -DDEBUGGING -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 -g'
cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
ccversion=''
gccversion='6.3.0 20170516'
gccosandvers=''
intsize=4
longsize=8
ptrsize=8
doublesize=8
byteorder=12345678
doublekind=3
d_longlong=define
longlongsize=8
d_longdbl=define
longdblsize=16
longdblkind=3
ivtype='long'
ivsize=8
nvtype='double'
nvsize=8
Off_t='off_t'
lseeksize=8
alignbytes=8
prototype=define
Linker and Libraries:
ld='cc'
ldflags =' -fstack-protector-strong -L/usr/local/lib'
libpth=/usr/local/lib /usr/lib/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib
libs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
libc=libc-2.24.so
so=so
useshrplib=false
libperl=libperl.a
gnulibc_version='2.24'
Dynamic Linking:
dlsrc=dl_dlopen.xs
dlext=so
d_dlsymun=undef
ccdlflags='-Wl,-E'
cccdlflags='-fPIC'
lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector-strong'
Characteristics of this binary (from libperl):
Compile-time options:
DEBUGGING
HAS_TIMES
MULTIPLICITY
PERLIO_LAYERS
PERL_COPY_ON_WRITE
PERL_DONT_CREATE_GVSV
PERL_MALLOC_WRAP
PERL_OP_PARENT
PERL_PRESERVE_IVUV
PERL_TRACK_MEMPOOL
PERL_USE_DEVEL
USE_64_BIT_ALL
USE_64_BIT_INT
USE_ITHREADS
USE_LARGE_FILES
USE_LOCALE
USE_LOCALE_COLLATE
USE_LOCALE_CTYPE
USE_LOCALE_NUMERIC
USE_LOCALE_TIME
USE_PERLIO
USE_PERL_ATOF
USE_REENTRANT_API
USE_THREAD_SAFE_LOCALE
Built under linux
Compiled at May 30 2022 10:17:19
%ENV:
PERL5LIB="/tmp/loop_over_bdir-30477-_WnfOT/PPR-0.001004-0/blib/arch:/tmp/loop_over_bdir-30477-_WnfOT/PPR-0.001004-0/blib/lib:/tmp/loop_over_bdir-30477-_WnfOT/Mu-1.191300-0/blib/arch:/tmp/loop_over_bdir-30477-_WnfOT/Mu-1.191300-0/blib/lib:/tmp/loop_over_bdir-30477-_WnfOT/MooX-ShortHas-1.202040-0/blib/arch:/tmp/loop_over_bdir-30477-_WnfOT/MooX-ShortHas-1.202040-0/blib/lib"
PERL5OPT=""
PERL5_CPANPLUS_IS_RUNNING="10639"
PERL5_CPAN_IS_RUNNING="10639"
PERL_CANARY_STABILITY_NOPROMPT="1"
PERL_MM_USE_DEFAULT="1"
PERL_USE_UNSAFE_INC="1"
@INC:
/tmp/loop_over_bdir-30477-_WnfOT/PPR-0.001004-0/blib/arch
/tmp/loop_over_bdir-30477-_WnfOT/PPR-0.001004-0/blib/lib
/tmp/loop_over_bdir-30477-_WnfOT/Mu-1.191300-0/blib/arch
/tmp/loop_over_bdir-30477-_WnfOT/Mu-1.191300-0/blib/lib
/tmp/loop_over_bdir-30477-_WnfOT/MooX-ShortHas-1.202040-0/blib/arch
/tmp/loop_over_bdir-30477-_WnfOT/MooX-ShortHas-1.202040-0/blib/lib
/home/sand/src/perl/repoperls/installed-perls/host/k93stretch/v5.36.0/2cd7/lib/site_perl/5.36.0/x86_64-linux-thread-multi
/home/sand/src/perl/repoperls/installed-perls/host/k93stretch/v5.36.0/2cd7/lib/site_perl/5.36.0
/home/sand/src/perl/repoperls/installed-perls/host/k93stretch/v5.36.0/2cd7/lib/5.36.0/x86_64-linux-thread-multi
/home/sand/src/perl/repoperls/installed-perls/host/k93stretch/v5.36.0/2cd7/lib/5.36.0
.