Perl: использовать строку как кусок кода - PullRequest
2 голосов
/ 30 июля 2010

Я хотел бы использовать строку (например, чтение из файла) в качестве фрагмента кода в моей Perl-программе.Например, я читаю строку (например, $str="1..100,171,398..1000"), затем я хочу напечатать все числа в диапазоне, представленном строкой.

Спасибо, Дейв

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Для этого конкретного случая см. Как развернуть строку типа «1..15,16» в список чисел?

В общем, используется evalвыполнить код в строке.Если у вас есть весь файл кода для выполнения, используйте do.Но убедитесь, что файл / строка безопасны перед рассмотрением этого.Если на самом деле «код» ограничен чем-то вроде вашего примера, то не используйте eval или do.

Обновление: получается Number :: Range слишком медленный для больших диапазонов;для вашего случая вам гораздо лучше использовать - вместо .. в ваших диапазонах и использовать Set :: IntSpan.Вы спрашиваете об эффективности: использование массива потребует несколько мегабайт памяти, но это не так уж и плохо.Set :: IntSpan предоставляет методы итерации, которые вы можете использовать вместо генерации массива, но я, вероятно, не стал бы беспокоиться.

1 голос
/ 30 июля 2010

Number :: Range использует ваш синтаксис .., но у него нет итератора. Set :: IntSpan использует - вместо .., но имеет с итератором, который упрощает печать набора без создания гигантского массива.

use Set::IntSpan;

my $str = "1..100,171,398..1000";
$str =~ s/\.\./-/g;
my $set = Set::IntSpan->new($str);

for (my $i = $set->first; defined $i; $i = $set->next) {
  print "$i\n"; # Or however you'd like to format it
}

Внутри Set :: IntSpan хранит диапазоны, поэтому это должно быть достаточно эффективным с точки зрения памяти. Вы также можете использовать метод spans для получения проанализированных диапазонов. Это потребует от вас написать немного больше кода, но будет означать, что вам не нужно делать вызов метода для каждого числа в диапазоне. Вызовы методов в Perl немного медленные, но я не стал бы беспокоиться об этом, если только приведенный выше код выполняется слишком долго.

0 голосов
/ 30 июля 2010

Вы можете использовать eval для выполнения кода в переменной.Хотя интерполяция может быть веселой.

eval "for ($str) { print \"\$_\n\";}"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...