Я хочу вставить следующее в качестве значения переменной в некоторый Ruby:
`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./
Окружение этого в двойных кавычках не работает, так есть ли доступная вещь escape_until_the_end?
Я хочу вставить следующее в качестве значения переменной в некоторый Ruby:
`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./
Окружение этого в двойных кавычках не работает, так есть ли доступная вещь escape_until_the_end?
Не используйте несколько методов - держите его простым.
Сбегите #, обратную косую черту и двойную кавычку.
irb(main):001:0> foo = "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./"
=> "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./"
Или, если вы не хотите избегать # (символ замены для переменных в строках с двойными кавычками), вместо этого используйте и избегайте одиночных кавычек:
irb(main):002:0> foo = '`[email protected]#$%^&*()_-+={}|[]\\:";\'<>?,./'
=> "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./"
% q отлично подходит для множества других строк, которые не содержат всех символов пунктуации ascii.:)
%q(text without parens)
%q{text without braces}
%Q[text without brackets with #{foo} substitution]
Edit: Очевидно, вы также можете использовать сбалансированные парс внутри% q(), но я бы подумал, что это немного опасно с точки зрения обслуживания, поскольку там нет семантики, чтобы подразумевать, что вы всегда будете балансировать свои parens в строке.
Во-первых, если я не сумасшедший %q()
работает здесь, отлично, так как внутренние круглые скобки сбалансированы:
>> weird = %q(`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./)
=> "`[email protected]\#$%^&*()_-+={}|[]\\:";'<>?,./"
>> puts weird
`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./
В качестве побочного примечания: при использовании %q
у вас всегда есть ядерная опция использования пробелов в качестве разделителя. Это фол и официально Bad Idea, но он работает.
Опять же, я бы этого не сделал, но просто чтобы увидеть...
>> weird = %q `[email protected]#$%^&*()_-+={}|[]\:";'<>?,./
=> "`[email protected]\#$%^&*()_-+={}|[]\\:";'<>?,./"
<<EOT
, а %q{}
- ваши друзья. Информация об использовании их из Программирование Ruby
Руководство по прагматическому программисту.
Попробуйте смешивать различные подходы:
%q{`[email protected]#$%^&*()_-+}+"{}"+%q{=|[]\\:";'<>?,./}
или, наоборот, просто используйте обратную косую черту, чтобы избежать проблемных символов:
"`[email protected]\#$%^&*()_-+{}=|[]\\:\";'<>?,./"
Первое, что я обычно думаю, было бы директивой % q, но поскольку вы, кажется, используете всю пунктуацию, которую обычно используете для ее разграничения, я не могу подумайте о простом способе заставить его работать здесь.
Во-вторых, я бы подумал, что это будет heredoc:
mystring = <<END
`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./
END
Это ломается после обратной косой черты.
Итак, мой третий ответ, неуклюжий, но самое лучшее, что я могу подумать всего за две минуты, - это заменить что-то безвредное для "проблемных" символов, а затем заменить его после назначения:
mystring = '`[email protected]#$%^&*()_-+={}|[]\:"; <>?,./'.tr(" ","'")
Мне это не нравится, но оно работает.