我想在我的perl程序中使用一个字符串(例如从文件中读取)作为一段代码。例如,我读了一个字符串(例如$str="1..100,171,398..1000"
),然后我想打印字符串所代表的范围内的所有数字。
谢谢, 戴夫
答案 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\";}"