perl:使用string作为代码段

时间:2010-07-30 16:30:15

标签: perl string

我想在我的perl程序中使用一个字符串(例如从文件中读取)作为一段代码。例如,我读了一个字符串(例如$str="1..100,171,398..1000"),然后我想打印字符串所代表的范围内的所有数字。

谢谢, 戴夫

3 个答案:

答案 0 :(得分:3)

对于该特定情况,请参阅How can I expand a string like "1..15,16" into a list of numbers?

通常,eval用于执行字符串中的代码。如果要执行完整的代码文件,请使用do。但在考虑这个之前,请确保文件/字符串是安全的。 如果实际上“代码”仅限于您的示例,请使用eval或do。

更新:结果编号::范围是大范围的狗慢;对于你的情况你最好不要使用 - 而不是..在你的范围内并使用Set :: IntSpan。您询问效率:使用数组会消耗几兆内存,但这并不是那么糟糕。 Set :: IntSpan确实提供了你可以使用的迭代方法,而不仅仅是生成数组,但我可能不会打扰。

答案 1 :(得分:1)

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中的方法调用有点慢,但我不担心它,除非上面的代码运行时间太长。

答案 2 :(得分:0)

您可以使用eval在变量中执行代码。虽然插值可以很有趣。

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