TextMate-style syntax highlighting in PHP
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

2816 lines
68 KiB

{
"scopeName": "source.perl",
"name": "Perl",
"fileTypes": [
"pl",
"PL",
"pm",
"pod",
"psgi",
"t"
],
"firstLineMatch": "(?x)\n# Hashbang\n^\\#!.*(?:\\s|\\/|(?<=!)\\b)perl(?:$|\\s)\n|\n# Modeline\n(?i:\n # Emacs\n -\\*-(?:(?:(?!mode\\s*:)[^:;]+:[^:;]+;)*\\s*mode\\s*:)?\\s*\n perl\n \\s*(?:;[^:;]+:[^:;]+?)*;?\\s*-\\*-\n |\n # Vim\n (?:(?:\\s|^)vi(?:m[<=>]?\\d+|m)?|(?!^)\\sex)(?=:(?=\\s*set?\\s[^\\n:]+:)|:(?!\\s*set?\\s))(?:(?:\\s|\\s*:\\s*)\\w*(?:\\s*=(?:[^\\n\\\\\\s]|\\\\.)*)?)*[\\s:](?:filetype|ft|syntax)\\s*=\n perl\n (?=\\s|:|$)\n)",
"patterns": [
{
"include": "#line_comment"
},
{
"begin": "^(?==)",
"end": "^(=cut\\b.*$)",
"endCaptures": {
"1": {
"patterns": [
{
"include": "#pod"
}
]
}
},
"name": "comment.block.documentation.perl",
"patterns": [
{
"include": "#pod"
}
]
},
{
"include": "#sub"
},
{
"include": "#variable"
},
{
"include": "#version_literal"
},
{
"include": "#numbers"
},
{
"include": "#pragmas"
},
{
"applyEndPatternLast": 1,
"begin": "\\b(?=qr\\s*[^\\s\\w])",
"comment": "string.regexp.compile.perl",
"end": "((([egimosxradlupcn]*)))(?=(\\s+\\S|\\s*[;\\,\\#\\{\\}\\)]|$))",
"endCaptures": {
"1": {
"name": "string.regexp.compile.perl"
},
"2": {
"name": "punctuation.definition.string.perl"
},
"3": {
"name": "keyword.control.regexp-option.perl"
}
},
"patterns": [
{
"begin": "(qr)\\s*{",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "}",
"name": "string.regexp.compile.nested_braces.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_braces_interpolated"
}
]
},
{
"begin": "(qr)\\s*\\[",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\]",
"name": "string.regexp.compile.nested_brackets.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_brackets_interpolated"
}
]
},
{
"begin": "(qr)\\s*<",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": ">",
"name": "string.regexp.compile.nested_ltgt.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_ltgt_interpolated"
}
]
},
{
"begin": "(qr)\\s*\\(",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\)",
"name": "string.regexp.compile.nested_parens.perl",
"patterns": [
{
"comment": "This is to prevent thinks like qr/foo$/ to treat $/ as a variable",
"match": "\\$(?=[^\\s\\w\\'\\{\\[\\(\\<])"
},
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_parens_interpolated"
}
]
},
{
"begin": "(qr)\\s*\\'",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\'",
"name": "string.regexp.compile.single-quote.perl",
"patterns": [
{
"include": "#escaped_char"
}
]
},
{
"begin": "(qr)\\s*([^\\s\\w\\'\\{\\[\\(\\<])",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\2",
"name": "string.regexp.compile.simple-delimiter.perl",
"patterns": [
{
"comment": "This is to prevent thinks like qr/foo$/ to treat $/ as a variable",
"match": "\\$(?=[^\\s\\w\\'\\{\\[\\(\\<])",
"name": "keyword.control.anchor.perl"
},
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_parens_interpolated"
}
]
}
]
},
{
"applyEndPatternLast": 1,
"begin": "(?<!\\{|\\+|\\-)\\b(?=m\\s*[^\\sa-zA-Z0-9])",
"comment": "string.regexp.find-m.perl",
"end": "((([egimosxradlupcn]*)))(?=(\\s+\\S|\\s*[;\\,\\#\\{\\}\\)]|$))",
"endCaptures": {
"1": {
"name": "string.regexp.find-m.perl"
},
"2": {
"name": "punctuation.definition.string.perl"
},
"3": {
"name": "keyword.control.regexp-option.perl"
}
},
"patterns": [
{
"begin": "(m)\\s*\\{",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\}",
"name": "string.regexp.find-m.nested_braces.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_braces_interpolated"
}
]
},
{
"begin": "(m)\\s*\\[",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\]",
"name": "string.regexp.find-m.nested_brackets.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_brackets_interpolated"
}
]
},
{
"begin": "(m)\\s*<",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": ">",
"name": "string.regexp.find-m.nested_ltgt.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_ltgt_interpolated"
}
]
},
{
"begin": "(m)\\s*\\(",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\)",
"name": "string.regexp.find-m.nested_parens.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_parens_interpolated"
}
]
},
{
"begin": "(m)\\s*\\'",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\'",
"name": "string.regexp.find-m.single-quote.perl",
"patterns": [
{
"include": "#escaped_char"
}
]
},
{
"begin": "(?<!\\{|\\+|\\-)(m)\\s*([^\\sa-zA-Z0-9\\'\\{\\[\\(\\<])",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\2",
"name": "string.regexp.find-m.simple-delimiter.perl",
"patterns": [
{
"comment": "This is to prevent thinks like qr/foo$/ to treat $/ as a variable",
"match": "\\$(?=[^\\sa-zA-Z0-9\\'\\{\\[\\(\\<])",
"name": "keyword.control.anchor.perl"
},
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"begin": "\\[",
"end": "\\]",
"patterns": [
{
"comment": "This is to prevent thinks like qr/foo$/ to treat $/ as a variable",
"match": "\\$(?=[^\\s\\w\\'\\{\\[\\(\\<])",
"name": "keyword.control.anchor.perl"
},
{
"include": "#escaped_char"
}
]
},
{
"include": "#nested_parens_interpolated"
}
]
}
]
},
{
"applyEndPatternLast": 1,
"begin": "\\b(?=(?<!\\&)(s)(\\s+\\S|\\s*[;\\,\\{\\}\\(\\)\\[<]|$))",
"comment": "string.regexp.replace.perl",
"end": "((([egimosxradlupcn]*)))(?=(\\s+\\S|\\s*[;\\,\\}\\)\\]>]|$))",
"endCaptures": {
"1": {
"name": "string.regexp.replace.perl"
},
"2": {
"name": "punctuation.definition.string.perl"
},
"3": {
"name": "keyword.control.regexp-option.perl"
}
},
"patterns": [
{
"begin": "(s)\\s*\\{",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\}",
"name": "string.regexp.nested_braces.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_braces"
}
]
},
{
"begin": "(s)\\s*\\[",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\]",
"name": "string.regexp.nested_brackets.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_brackets"
}
]
},
{
"begin": "(s)\\s*<",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": ">",
"name": "string.regexp.nested_ltgt.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_ltgt"
}
]
},
{
"begin": "(s)\\s*\\(",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "\\)",
"name": "string.regexp.nested_parens.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_parens"
}
]
},
{
"begin": "\\{",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "\\}",
"name": "string.regexp.format.nested_braces.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_braces_interpolated"
}
]
},
{
"begin": "\\[",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "\\]",
"name": "string.regexp.format.nested_brackets.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_brackets_interpolated"
}
]
},
{
"begin": "<",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": ">",
"name": "string.regexp.format.nested_ltgt.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_ltgt_interpolated"
}
]
},
{
"begin": "\\(",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "\\)",
"name": "string.regexp.format.nested_parens.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_parens_interpolated"
}
]
},
{
"begin": "'",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "'",
"name": "string.regexp.format.single_quote.perl",
"patterns": [
{
"match": "\\\\['\\\\]",
"name": "constant.character.escape.perl"
}
]
},
{
"begin": "([^\\s\\w\\[({<;])",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "\\1",
"name": "string.regexp.format.simple_delimiter.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"match": "\\s+"
}
]
},
{
"begin": "\\b(?=s([^\\sa-zA-Z0-9\\[({<]).*\\1([egimosxradlupcn]*)([\\}\\)\\;\\,]|\\s+))",
"comment": "string.regexp.replaceXXX",
"end": "((([egimosxradlupcn]*)))(?=([\\}\\)\\;\\,]|\\s+|$))",
"endCaptures": {
"1": {
"name": "string.regexp.replace.perl"
},
"2": {
"name": "punctuation.definition.string.perl"
},
"3": {
"name": "keyword.control.regexp-option.perl"
}
},
"patterns": [
{
"begin": "(s\\s*)([^\\sa-zA-Z0-9\\[({<])",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "(?=\\2)",
"name": "string.regexp.replaceXXX.simple_delimiter.perl",
"patterns": [
{
"include": "#escaped_char"
}
]
},
{
"begin": "'",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "'",
"name": "string.regexp.replaceXXX.format.single_quote.perl",
"patterns": [
{
"match": "\\\\['\\\\]",
"name": "constant.character.escape.perl.perl"
}
]
},
{
"begin": "([^\\sa-zA-Z0-9\\[({<])",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "\\1",
"name": "string.regexp.replaceXXX.format.simple_delimiter.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
}
]
},
{
"begin": "\\b(?=(?<!\\\\)s\\s*([^\\s\\w\\[({<>]))",
"comment": "Multiline regex replace using the \"x\" modificator",
"end": "((([egimosradlupcn]*x[egimosradlupcn]*)))\\b",
"endCaptures": {
"1": {
"name": "string.regexp.replace.perl"
},
"2": {
"name": "punctuation.definition.string.perl"
},
"3": {
"name": "keyword.control.regexp-option.perl"
}
},
"patterns": [
{
"begin": "(s)\\s*(.)",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
},
"1": {
"name": "support.function.perl"
}
},
"end": "(?=\\2)",
"name": "string.regexp.replace.extended.simple_delimiter.perl",
"patterns": [
{
"include": "#escaped_char"
}
]
},
{
"begin": "'",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "'(?=[egimosradlupcn]*x[egimosradlupcn]*)\\b",
"name": "string.regexp.replace.extended.simple_delimiter.perl",
"patterns": [
{
"include": "#escaped_char"
}
]
},
{
"begin": "(.)",
"captures": {
"0": {
"name": "punctuation.definition.string.perl"
}
},
"end": "\\1(?=[egimosradlupcn]*x[egimosradlupcn]*)\\b",
"name": "string.regexp.replace.extended.simple_delimiter.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
}
]
},
{
"begin": "(?<=\\(|\\{|~|&|\\||if|unless|^)\\s*((\\/))",
"beginCaptures": {
"1": {
"name": "string.regexp.find.perl"
},
"2": {
"name": "punctuation.definition.string.perl"
}
},
"end": "((\\1([egimosxradlupcn]*)))(?=(\\s+\\S|\\s*[;\\,\\#\\{\\}\\)]|$))",
"endCaptures": {
"1": {
"name": "string.regexp.find.perl"
},
"2": {
"name": "punctuation.definition.string.perl"
},
"3": {
"name": "keyword.control.regexp-option.perl"
}
},
"contentName": "string.regexp.find.perl",
"patterns": [
{
"comment": "This is to prevent thinks like /foo$/ to treat $/ as a variable",
"match": "\\$(?=\\/)",
"name": "keyword.control.anchor.perl"
},
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"captures": {
"1": {
"name": "constant.other.key.perl"
}
},
"match": "\\b(\\w+)\\s*(?==>)"
},
{
"match": "(?<={)\\s*\\w+\\s*(?=})",
"name": "constant.other.bareword.perl"
},
{
"captures": {
"1": {
"name": "keyword.control.perl"
},
"2": {
"name": "entity.name.type.class.perl"
}
},
"match": "^\\s*(package)\\s+([^\\s;]+)",
"name": "meta.class.perl"
},
{},
{
"captures": {
"1": {
"name": "entity.name.function.perl"
},
"2": {
"name": "punctuation.definition.parameters.perl"
},
"3": {
"name": "variable.parameter.function.perl"
}
},
"match": "^\\s*(BEGIN|UNITCHECK|CHECK|INIT|END|DESTROY)\\b",
"name": "meta.function.perl"
},
{
"begin": "^(?=(\\t| {4}))",
"end": "(?=[^\\t\\s])",
"name": "meta.leading-tabs",
"patterns": [
{
"captures": {
"1": {
"name": "meta.odd-tab"
},
"2": {
"name": "meta.even-tab"
}
},
"match": "(\\t| {4})(\\t| {4})?"
}
]
},
{
"captures": {
"1": {
"name": "support.function.perl"
},
"2": {
"name": "punctuation.definition.string.perl"
},
"5": {
"name": "punctuation.definition.string.perl"
},
"8": {
"name": "punctuation.definition.string.perl"
}
},
"match": "\\b(tr|y)\\s*([^A-Za-z0-9\\s])(.*?)(?<!\\\\)(\\\\{2})*(\\2)(.*?)(?<!\\\\)(\\\\{2})*(\\2)",
"name": "string.regexp.replace.perl"
},
{
"match": "\\b(__FILE__|__LINE__|__PACKAGE__|__SUB__)\\b",
"name": "constant.language.perl"
},
{
"begin": "\\b(__DATA__|__END__)\\n?",
"captures": {
"1": {
"name": "constant.language.perl"
}
},
"contentName": "comment.block.documentation.perl",
"end": "(?=N)A",
"patterns": [
{
"include": "#pod"
}
]
},
{
"include": "#separators"
},
{
"match": "(?<!->)\\b(continue|default|die|do|else|elsif|exit|for|foreach|given|goto|if|last|next|redo|return|select|unless|until|wait|when|while|switch|case|require|use|eval)\\b",
"name": "keyword.control.perl"
},
{
"match": "\\b(my|our|local|state)\\b",
"name": "storage.modifier.perl"
},
{
"include": "#operators"
},
{
"begin": "(((<<) *\"HTML\"))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.doublequote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.html.embedded.perl",
"end": "(^HTML$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "text.html.basic"
}
]
},
{
"begin": "(((<<) *\"XML\"))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.doublequote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.xml.embedded.perl",
"end": "(^XML$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "text.xml"
}
]
},
{
"begin": "(((<<) *\"CSS\"))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.doublequote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.css.embedded.perl",
"end": "(^CSS$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "source.css"
}
]
},
{
"begin": "(((<<) *\"JAVASCRIPT\"))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.doublequote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "source.js.embedded.perl",
"end": "(^JAVASCRIPT$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "source.js"
}
]
},
{
"begin": "(((<<) *\"SQL\"))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.doublequote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "source.sql.embedded.perl",
"end": "(^SQL$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "source.sql"
}
]
},
{
"begin": "(((<<) *\"POSTSCRIPT\"))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.doublequote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.postscript.embedded.perl",
"end": "(^POSTSCRIPT$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "source.postscript"
}
]
},
{
"begin": "(((<<) *\"([^\"]*)\"))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.doublequote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"5": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "string.unquoted.heredoc.doublequote.perl",
"end": "(^\\4$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"begin": "(((<<) *'HTML'))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.quote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.html.embedded.perl",
"end": "(^HTML$)",
"patterns": [
{
"include": "text.html.basic"
}
]
},
{
"begin": "(((<<) *'XML'))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.quote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.xml.embedded.perl",
"end": "(^XML$)",
"patterns": [
{
"include": "text.xml"
}
]
},
{
"begin": "(((<<) *'CSS'))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.quote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.css.embedded.perl",
"end": "(^CSS$)",
"patterns": [
{
"include": "source.css"
}
]
},
{
"begin": "(((<<) *'JAVASCRIPT'))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.quote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "source.js.embedded.perl",
"end": "(^JAVASCRIPT$)",
"patterns": [
{
"include": "source.js"
}
]
},
{
"begin": "(((<<) *'SQL'))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.quote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "source.sql.embedded.perl",
"end": "(^SQL$)",
"patterns": [
{
"include": "source.sql"
}
]
},
{
"begin": "(((<<) *'POSTSCRIPT'))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.quote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "source.postscript.embedded.perl",
"end": "(^POSTSCRIPT)",
"patterns": [
{
"include": "source.postscript"
}
]
},
{
"begin": "(((<<) *'([^']*)'))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.quote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"5": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "string.unquoted.heredoc.quote.perl",
"end": "(^\\4$)"
},
{
"begin": "(((<<) *\\\\((?![=\\d\\$\\( ])[^;,'\"`\\s\\)]*)))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.quote.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"5": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "string.unquoted.heredoc.quote.perl",
"end": "(^\\4$)"
},
{
"begin": "(((<<) *`([^`]*)`))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.backtick.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"5": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "string.unquoted.heredoc.backtick.perl",
"end": "(^\\4$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"begin": "(((<<) *HTML\\b))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.html.embedded.perl",
"end": "(^HTML$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "text.html.basic"
}
]
},
{
"begin": "(((<<) *XML\\b))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "text.xml.embedded.perl",
"end": "(^XML$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "text.xml"
}
]
},
{
"begin": "(((<<) *JAVASCRIPT\\b))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "source.js.embedded.perl",
"end": "(^JAVASCRIPT$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "source.js"
}
]
},
{
"begin": "(((<<) *SQL\\b))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "source.sql.embedded.perl",
"end": "(^SQL$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "source.sql"
}
]
},
{
"begin": "(((<<) *POSTSCRIPT\\b))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"4": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "source.postscript.embedded.perl",
"end": "(^POSTSCRIPT)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "source.postscript"
}
]
},
{
"begin": "(((<<) *((?![-+=.;\\d\\$\\(\\s]|$)[^;,'\"`\\s\\)]*)))(.*)\\n?",
"captures": {
"1": {
"name": "punctuation.definition.string.perl"
},
"2": {
"name": "string.unquoted.heredoc.perl"
},
"3": {
"name": "punctuation.definition.heredoc.perl"
},
"5": {
"patterns": [
{
"include": "$self"
}
]
}
},
"contentName": "string.unquoted.heredoc.perl",
"end": "(^\\4$)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqq\\s*([^\\(\\{\\[\\<\\w\\s])",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\1",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.qq.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqx\\s*([^'\\(\\{\\[\\<\\w\\s])",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\1",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.interpolated.qx.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqx\\s*'",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "'",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.interpolated.qx.single-quote.perl",
"patterns": [
{
"include": "#escaped_char"
}
]
},
{
"begin": "\"",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\"",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.double.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"begin": "(?<!->)\\bqw?\\s*([^\\(\\{\\[\\<\\w\\s])",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\1",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.q.perl"
},
{
"begin": "'",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "'",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.single.perl",
"patterns": [
{
"match": "\\\\['\\\\]",
"name": "constant.character.escape.perl"
}
]
},
{
"begin": "`",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "`",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.interpolated.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
}
]
},
{
"begin": "(?<!->)\\bqq\\s*\\(",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.qq-paren.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_parens_interpolated"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqq\\s*\\{",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\}",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.qq-brace.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_braces_interpolated"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqq\\s*\\[",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\]",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.qq-bracket.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_brackets_interpolated"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqq\\s*\\<",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\>",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.qq-ltgt.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_ltgt_interpolated"
},
{
"include": "#variable"
}
]
},
{
"begin": "(?<!->)\\bqx\\s*\\(",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.interpolated.qx-paren.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_parens_interpolated"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqx\\s*\\{",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\}",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.interpolated.qx-brace.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_braces_interpolated"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqx\\s*\\[",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\]",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.interpolated.qx-bracket.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_brackets_interpolated"
},
{
"include": "#variable"
}
]
},
{
"begin": "\\bqx\\s*\\<",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\>",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.interpolated.qx-ltgt.perl",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_ltgt_interpolated"
},
{
"include": "#variable"
}
]
},
{
"begin": "(?<!->)\\bqw?\\s*\\(",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.q-paren.perl",
"patterns": [
{
"include": "#nested_parens"
}
]
},
{
"begin": "\\bqw?\\s*\\{",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\}",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.q-brace.perl",
"patterns": [
{
"include": "#nested_braces"
}
]
},
{
"begin": "\\bqw?\\s*\\[",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\]",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.q-bracket.perl",
"patterns": [
{
"include": "#nested_brackets"
}
]
},
{
"begin": "\\bqw?\\s*\\<",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "\\>",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.quoted.other.q-ltgt.perl",
"patterns": [
{
"include": "#nested_ltgt"
}
]
},
{
"begin": "^__\\w+__",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.perl"
}
},
"end": "$",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.perl"
}
},
"name": "string.unquoted.program-block.perl"
},
{
"begin": "\\b(format)\\s+(\\w+)\\s*=",
"beginCaptures": {
"1": {
"name": "support.function.perl"
},
"2": {
"name": "entity.name.function.format.perl"
}
},
"end": "^\\.\\s*$",
"name": "meta.format.perl",
"patterns": [
{
"include": "#line_comment"
},
{
"include": "#variable"
}
]
},
{
"match": "\\b(ARGV|DATA|ENV|SIG|STDERR|STDIN|STDOUT|atan2|bind|binmode|bless|caller|chdir|chmod|chomp|chop|chown|chr|chroot|close|closedir|connect|cos|crypt|dbmclose|dbmopen|defined|delete|dump|each|endgrent|endhostent|endnetent|endprotoent|endpwent|endservent|eof|eval|exec|exists|exp|fcntl|fileno|flock|fork|formline|getc|getgrent|getgrgid|getgrnam|gethostbyaddr|gethostbyname|gethostent|getlogin|getnetbyaddr|getnetbyname|getnetent|getpeername|getpgrp|getppid|getpriority|getprotobyname|getprotobynumber|getprotoent|getpwent|getpwnam|getpwuid|getservbyname|getservbyport|getservent|getsockname|getsockopt|glob|gmtime|grep|hex|import|index|int|ioctl|join|keys|kill|lc|lcfirst|length|link|listen|local|localtime|log|lstat|m|map|mkdir|msgctl|msgget|msgrcv|msgsnd|no|oct|open|opendir|ord|pack|pipe|pop|pos|print|printf|push|quotemeta|rand|read|readdir|readlink|recv|ref|rename|reset|reverse|rewinddir|rindex|rmdir|s|say|scalar|seek|seekdir|semctl|semget|semop|send|setgrent|sethostent|setnetent|setpgrp|setpriority|setprotoent|setpwent|setservent|setsockopt|shift|shmctl|shmget|shmread|shmwrite|shutdown|sin|sleep|socket|socketpair|sort|splice|split|sprintf|sqrt|srand|stat|study|substr|symlink|syscall|sysopen|sysread|system|syswrite|tell|telldir|tie|tied|time|times|tr|truncate|uc|ucfirst|umask|undef|unlink|unpack|unshift|untie|utime|values|vec|waitpid|wantarray|warn|write|y)\\b",
"name": "support.function.perl"
},
{
"begin": "{",
"end": "}",
"beginCaptures": {
"0": {
"name": "punctuation.section.brace.curly.bracket.begin.perl"
}
},
"endCaptures": {
"0": {
"name": "punctuation.section.brace.curly.bracket.end.perl"
}
},
"patterns": [
{
"include": "$self"
}
]
},
{
"begin": "\\[",
"end": "\\]",
"beginCaptures": {
"0": {
"name": "punctuation.section.square.bracket.begin.perl"
}
},
"endCaptures": {
"0": {
"name": "punctuation.section.square.bracket.end.perl"
}
},
"patterns": [
{
"include": "$self"
}
]
},
{
"begin": "\\(",
"end": "\\)",
"beginCaptures": {
"0": {
"name": "punctuation.section.parenthesis.round.bracket.begin.perl"
}
},
"endCaptures": {
"0": {
"name": "punctuation.section.parenthesis.round.bracket.end.perl"
}
},
"patterns": [
{
"include": "$self"
}
]
},
{
"match": "}",
"name": "punctuation.unmatched.brace.curly.bracket.end.perl"
},
{
"match": "\\]",
"name": "punctuation.unmatched.square.bracket.end.perl"
},
{
"match": "\\)",
"name": "punctuation.unmatched.parenthesis.round.bracket.end.perl"
}
],
"repository": {
"escaped_char": {
"patterns": [
{
"match": "\\\\\\d+",
"name": "constant.character.escape.perl"
},
{
"match": "\\\\c[^\\s\\\\]",
"name": "constant.character.escape.perl"
},
{
"match": "\\\\g(?:\\{(?:\\w*|-\\d+)\\}|\\d+)",
"name": "constant.character.escape.perl"
},
{
"match": "\\\\k(?:\\{\\w*\\}|<\\w*>|'\\w*')",
"name": "constant.character.escape.perl"
},
{
"match": "\\\\N\\{[^\\}]*\\}",
"name": "constant.character.escape.perl"
},
{
"match": "\\\\o\\{\\d*\\}",
"name": "constant.character.escape.perl"
},
{
"match": "\\\\(?:p|P)(?:\\{\\w*\\}|P)",
"name": "constant.character.escape.perl"
},
{
"match": "\\\\x(?:[0-9a-zA-Z]{2}|\\{\\w*\\})?",
"name": "constant.character.escape.perl"
},
{
"match": "\\\\.",
"name": "constant.character.escape.perl"
}
]
},
"line_comment": {
"patterns": [
{
"begin": "(^[ \\t]+)?(?=#)",
"beginCaptures": {
"1": {
"name": "punctuation.whitespace.comment.leading.perl"
}
},
"end": "(?!\\G)",
"patterns": [
{
"begin": "#",
"beginCaptures": {
"0": {
"name": "punctuation.definition.comment.perl"
}
},
"end": "\\n",
"name": "comment.line.number-sign.perl"
}
]
}
]
},
"nested_braces": {
"begin": "\\{",
"captures": {
"1": {
"name": "punctuation.section.scope.perl"
}
},
"end": "\\}",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_braces"
}
]
},
"nested_braces_interpolated": {
"begin": "\\{",
"captures": {
"1": {
"name": "punctuation.section.scope.perl"
}
},
"end": "\\}",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_braces_interpolated"
}
]
},
"nested_brackets": {
"begin": "\\[",
"captures": {
"1": {
"name": "punctuation.section.scope.perl"
}
},
"end": "\\]",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_brackets"
}
]
},
"nested_brackets_interpolated": {
"begin": "\\[",
"captures": {
"1": {
"name": "punctuation.section.scope.perl"
}
},
"end": "\\]",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_brackets_interpolated"
}
]
},
"nested_ltgt": {
"begin": "<",
"captures": {
"1": {
"name": "punctuation.section.scope.perl"
}
},
"end": ">",
"patterns": [
{
"include": "#nested_ltgt"
}
]
},
"nested_ltgt_interpolated": {
"begin": "<",
"captures": {
"1": {
"name": "punctuation.section.scope.perl"
}
},
"end": ">",
"patterns": [
{
"include": "#variable"
},
{
"include": "#nested_ltgt_interpolated"
}
]
},
"nested_parens": {
"begin": "\\(",
"captures": {
"1": {
"name": "punctuation.section.scope.perl"
}
},
"end": "\\)",
"patterns": [
{
"include": "#escaped_char"
},
{
"include": "#nested_parens"
}
]
},
"nested_parens_interpolated": {
"begin": "\\(",
"captures": {
"1": {
"name": "punctuation.section.scope.perl"
}
},
"end": "\\)",
"patterns": [
{
"comment": "This is to prevent thinks like qr/foo$/ to treat $/ as a variable",
"match": "\\$(?=[^\\s\\w\\'\\{\\[\\(\\<])",
"name": "keyword.control.anchor.perl"
},
{
"include": "#escaped_char"
},
{
"include": "#variable"
},
{
"include": "#nested_parens_interpolated"
}
]
},
"numbers": {
"patterns": [
{
"match": "\\d+(_\\d+)+",
"name": "constant.numeric.decimal.with-thousand-separators.perl"
},
{
"match": "(?:\\b\\d+(?:(\\.)\\d*)?|(?<!\\.)\\B(\\.)\\d+)[eE](?:[-+\\d]\\d*(?:(\\.)\\d*)?)?",
"captures": {
"0": {
"name": "constant.numeric.exponential.perl"
},
"1": {
"name": "punctuation.delimiter.decimal.period.perl"
},
"2": {
"name": "punctuation.delimiter.decimal.period.perl"
},
"3": {
"name": "punctuation.delimiter.decimal.period.perl"
}
}
},
{
"match": "\\b0[xX][\\da-fA-F]*",
"name": "constant.numeric.hexadecimal.perl"
},
{
"match": "\\b0[bB][01]*(?:_[01]+)*",
"name": "constant.numeric.binary.perl"
},
{
"match": "\\b\\d+(?:(\\.)\\d*(?!\\.)\\d?)?|(?<!\\.)\\B(\\.)\\d+",
"captures": {
"0": {
"name": "constant.numeric.decimal.perl"
},
"1": {
"name": "punctuation.delimiter.decimal.period.perl"
},
"2": {
"name": "punctuation.delimiter.decimal.period.perl"
}
}
}
]
},
"operators": {
"patterns": [
{
"match": "(?<!\\w)\\-[rwx0RWXOezsfdlpSbctugkTBMAC]\\b",
"name": "keyword.operator.filetest.perl"
},
{
"begin": "<(?!=)(?=\\S*>)",
"beginCaptures": {
"0": {
"name": "keyword.operator.readline.perl"
}
},
"end": ">",
"endCaptures": {
"0": {
"name": "keyword.operator.readline.perl"
}
},
"patterns": [
{
"include": "#variable"
}
]
},
{
"match": "(?<=\\{)\\s*(\\.{3})\\s*(?=\\})",
"name": "keyword.operator.ellipsis.placeholder.perl"
},
{
"match": "(?:\\/\\/|\\|\\|)=",
"name": "keyword.operator.assignement.conditional.perl"
},
{
"match": "[&|^]=",
"name": "keyword.operator.assignement.compound.bitwise.perl"
},
{
"match": "[&|^]\\.=",
"name": "keyword.operator.assignement.compound.stringwise.perl"
},
{
"match": "(?:\\*\\*|[-+*%\\/])=",
"name": "keyword.operator.assignement.compound.perl"
},
{
"match": "<=>|==|!=|<=|>=|=~|!~|~~|<(?!<)|>(?!>)",
"name": "keyword.operator.comparison.perl"
},
{
"match": "\\b(eq|ne|lt|gt|le|ge|cmp)\\b",
"name": "keyword.operator.comparison.stringwise.perl"
},
{
"match": "\\b(and|or|xor|as|not)\\b",
"name": "keyword.operator.logical.perl"
},
{
"match": "&&|\\|\\|",
"name": "keyword.operator.logical.c-style.perl"
},
{
"match": "\\/\\/",
"name": "keyword.operator.logical.defined-or.perl"
},
{
"match": "\\+\\+",
"name": "keyword.operator.increment.perl"
},
{
"match": "--",
"name": "keyword.operator.decrement.perl"
},
{
"match": "\\*\\*|[-+*%\\/]",
"name": "keyword.operator.arithmetic.perl"
},
{
"match": "[&|^~]\\.",
"name": "keyword.operator.stringwise.perl"
},
{
"match": "[&|^~]|>>|<<(?!\\s*[^-+=.\\d\\$\\(\\s])",
"name": "keyword.operator.bitwise.perl"
},
{
"match": "=",
"name": "keyword.operator.assignement.perl"
},
{
"match": "\\.{2,3}",
"name": "keyword.operator.range.perl"
},
{
"match": "\\.",
"name": "keyword.operator.concatenation.perl"
},
{
"match": "\\bx(?![a-zA-Z_])",
"name": "keyword.operator.repetition.perl"
},
{
"match": "[?:]",
"name": "keyword.operator.ternary.perl"
}
]
},
"separators": {
"patterns": [
{
"match": ";",
"name": "punctuation.terminator.semicolon.perl"
},
{
"match": ",",
"name": "punctuation.separator.comma.perl"
},
{
"match": "::",
"name": "punctuation.separator.colon.perl"
},
{
"match": "->",
"name": "punctuation.separator.arrow.perl"
},
{
"match": "=>",
"name": "punctuation.separator.key-value.perl"
}
]
},
"pod": {
"patterns": [
{
"match": "^=(pod|back|cut)\\b",
"name": "storage.type.class.pod.perl"
},
{
"begin": "^(=begin)\\s+(html)\\s*$",
"end": "^(=end)\\s+(html)|^(?==cut)",
"name": "meta.embedded.pod.perl",
"beginCaptures": {
"1": {
"name": "storage.type.class.pod.perl"
},
"2": {
"name": "variable.other.pod.perl"
}
},
"endCaptures": {
"1": {
"name": "storage.type.class.pod.perl"
},
"2": {
"name": "variable.other.pod.perl"
}
},
"contentName": "text.embedded.html.basic",
"patterns": [
{
"include": "text.html.basic"
}
]
},
{
"match": "^(=(?:head[1-4]|item|over|encoding|begin|end|for))\\b\\s*(.*)",
"captures": {
"1": {
"name": "storage.type.class.pod.perl"
},
"2": {
"name": "variable.other.pod.perl",
"patterns": [
{
"include": "#pod-formatting"
}
]
}
}
},
{
"include": "#pod-formatting"
}
]
},
"pod-formatting": {
"patterns": [
{
"match": "I(?:<([^<>]+)>|<+(\\s+(?:(?<!\\s)>|[^>])+\\s+)>+)",
"name": "entity.name.type.instance.pod.perl",
"captures": {
"1": {
"name": "markup.italic.pod.perl"
},
"2": {
"name": "markup.italic.pod.perl"
}
}
},
{
"match": "B(?:<([^<>]+)>|<+(\\s+(?:(?<!\\s)>|[^>])+\\s+)>+)",
"name": "entity.name.type.instance.pod.perl",
"captures": {
"1": {
"name": "markup.bold.pod.perl"
},
"2": {
"name": "markup.bold.pod.perl"
}
}
},
{
"match": "C(?:<([^<>]+)>|<+(\\s+(?:(?<!\\s)>|[^>])+\\s+)>+)",
"name": "entity.name.type.instance.pod.perl",
"captures": {
"1": {
"name": "markup.raw.pod.perl"
},
"2": {
"name": "markup.raw.pod.perl"
}
}
},
{
"match": "L<([^>]+)>",
"name": "entity.name.type.instance.pod.perl",
"captures": {
"1": {
"name": "markup.underline.link.hyperlink.pod.perl"
}
}
},
{
"match": "[EFSXZ]<[^>]*>",
"name": "entity.name.type.instance.pod.perl"
}
]
},
"pragmas": {
"patterns": [
{
"begin": "(?<!->)\\b(no|use)(?=$|#|\\s)",
"end": "(?=}|$|;|#)",
"name": "meta.preprocessor.pragma.perl",
"beginCaptures": {
"1": {
"name": "keyword.control.directive.pragma.$1.perl"
}
},
"patterns": [
{
"match": "\\G\\s+(no|use)(?=\\s|;|#)",
"captures": {
"1": {
"name": "invalid.illegal.syntax.pragma.perl"
}
}
},
{
"include": "version_literal"
},
{
"include": "$self"
},
{
"match": "-\\w+",
"name": "keyword.operator.pragma.flag.perl"
},
{
"match": "\\w+",
"name": "constant.language.pragma.module.perl"
}
]
},
{
"match": "(?<!->)\\b(enable|disable)\\s+(diagnostics)(?=$|;|#|\\s)",
"captures": {
"1": {
"name": "keyword.control.diagnostics.$1.perl"
},
"2": {
"name": "constant.language.pragma.module.perl"
}
},
"name": "meta.diagnostics.pragma.perl"
}
]
},
"sub": {
"match": "(?x) (?<!->)\n\\b (sub) \\b\n(?:\n \\s+\n ([-\\w]+)?\n (\n (\\()\n ([$@*;]*)\n (\\))\n )?\n)?",
"captures": {
"1": {
"name": "storage.type.function.sub.perl"
},
"2": {
"name": "entity.name.function.perl"
},
"3": {
"name": "meta.function.signature.perl"
},
"4": {
"name": "punctuation.section.signature.begin.bracket.curly.perl"
},
"5": {
"name": "storage.type.signature.method.perl"
},
"6": {
"name": "punctuation.section.signature.end.bracket.curly.perl"
}
},
"name": "meta.function.perl"
},
"variable": {
"patterns": [
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$)&(?![A-Za-z0-9_])",
"name": "variable.other.regexp.match.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$)`(?![A-Za-z0-9_])",
"name": "variable.other.regexp.pre-match.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$)'(?![A-Za-z0-9_])",
"name": "variable.other.regexp.post-match.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$)\\+(?![A-Za-z0-9_])",
"name": "variable.other.regexp.last-paren-match.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$)\"(?![A-Za-z0-9_])",
"name": "variable.other.readwrite.list-separator.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$)0(?![A-Za-z0-9_])",
"name": "variable.other.predefined.program-name.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$)[_ab\\*\\.\\/\\|,\\\\;#%=\\-~^:?!\\$<>\\(\\)\\[\\]@](?![A-Za-z0-9_])",
"name": "variable.other.predefined.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$)[0-9]+(?![A-Za-z0-9_])",
"name": "variable.other.subpattern.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "((\\$|@\\$|\\\\@|@|%\\$|\\\\%|%)(#)?)([a-zA-Zx7f-xff\\$]|::)([a-zA-Z0-9_x7f-xff\\$]|::)*\\b",
"name": "variable.other.readwrite.global.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
},
"2": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "(\\$\\{)(?:[a-zA-Zx7f-xff\\$]|::)(?:[a-zA-Z0-9_x7f-xff\\$]|::)*(\\})",
"name": "variable.other.readwrite.global.perl"
},
{
"captures": {
"1": {
"name": "punctuation.definition.variable.perl"
}
},
"match": "([\\$\\@\\%](#)?)[0-9_]\\b",
"name": "variable.other.readwrite.global.special.perl"
}
]
},
"version_literal": {
"match": "(?<!->)\\b\\s*(v[0-9]+(\\.[0-9]+)+)",
"captures": {
"1": {
"name": "constant.other.version.literal.perl"
}
}
}
}
}