Оценка escape-последовательностей в Perl - PullRequest
1 голос
/ 05 января 2012

Я читаю строки из файла. Эти строки содержат escape-последовательности, которые я хотел бы оценить перед дальнейшей обработкой. Итак, я делаю:

$t = eval("\"$t\"");

, который работает нормально. Но у меня есть сомнения по поводу производительности. Если eval разветвляет Perl-процесс каждый раз, это может привести к снижению производительности. Другим способом, который я решил сделать, было регулярное выражение, где я нашел связанные вопросы в SO.

Мой вопрос: есть ли лучший, более эффективный способ сделать это?

EDIT: перед вызовом eval в моем примере $ t содержит \064\065\x20a\n. Он оценивается в 45 a<LF>.

Ответы [ 3 ]

3 голосов
/ 05 января 2012

Не совсем понятно, как выглядят строки в файле и что вы с ними делаете, прежде чем перейти к eval.В объяснении чего-то не хватает.

Если вы просто хотите отменить экранирование в стиле C (как и в Perl), используйте Encode::Escape:

use Encode qw(decode);
use Encode::Escape qw();
my $string_with_unescaped_literals = decode 'ascii-escape', $string_with_escaped_literals;

Если у вас есть заполнители в файле, которые выглядят как переменные Perl, которые вы хотите заполнить значениями, тогда вы используете eval как шаблонизатор для бедного человека.Используйте реальный , который не имеет опасного побочного эффекта запуска произвольного кода.

1 голос
/ 13 февраля 2015
$string =~ s/\\([rnt'"\\])/"qq|\\$1|"/gee

string eval также может решить эту проблему, но он поднимает множество проблем безопасности и обслуживания, таких как @ in string

0 голосов
/ 05 января 2012

о нет, не используйте eval для этого, это опасно, если кто-то предоставит для него ввод типа "system ('sync; reboot');"

Но вы могли бы сделать что-то вроде этого:

#!/usr/bin/perl

$string = 'foo\"ba\\\'r';
printf("%s\n", $string);
$string =~ s/\\([\"\'])/$1/g;
printf("%s\n", $string);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...