Lua以外的哪些语言支持无数种字符串分隔符?

时间:2018-02-01 13:52:47

标签: syntax language-design

my_lua_string = [=[ This is a string delimited with long brackets; it contains other valid long brackets like [[this]] (or this: ]==]), but they are ignored because Lua looks for a long bracket that matches the opening delimiter. ]=]

Lua支持我没有用任何其他语言看到的东西:所谓的“长括号”,有时也被称为“长串”或“双括号”。有效的长括号对有多种:[[my multiline string]][=[...]=][==[...]==]等等。您可以将它们用于多行注释,如:--[[...]]--[=[...]=]等。这意味着可以创建任何字符串文字,或者可以注释任何代码,而无需转义内容:您只需选择一个带有多个等号的长括号,使得结束分隔符不会出现在字符串内。

是否有其他语言具有无限可扩展的字符串分隔符?我知道Perl的q样式,但AFAIK仅限于单个字符:q#...#qx...x,等等我对像Lua这样的解决方案特别感兴趣,超越了单字符分隔符。

(好奇:当我尝试使用ssh 'multiple; commands' ssh多个命令时,这个问题冒出来了,其中一个命令是对sudo sh -c '...'的调用。我认为shell是我唯一的环境经常手动创建具有多个引用级别的字符串文字。)

对于那些想要了解更多关于Lua长括号的人:

有效的Lua注释和有效的Lua字符串:

--[[ This comments out an assignment to my_lua_string
my_lua_string = [==[one [=[inner]=] two]==] 
]]

-- This is a string delimited with long brackets
[=[one ]] two]=]
--> 'one ]] two'

2 个答案:

答案 0 :(得分:1)

PostgreSQL允许这样:https://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-DOLLAR-QUOTING

它最常用于定义存储过程,如下所示(参见$$):

CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $myAddOne$ BEGIN RETURN i + 1; END; $myAddOne$ LANGUAGE plpgsql;

但是,我不知道其他任何人。

答案 1 :(得分:1)

UNIX shell(及其衍生物),Perl,PHP和Ruby(至少)支持HEREDOCs,其中任何东西都可以用作分隔标记。