arrays - 如何将此语法解析为 Perl 中的数组?

标签 arrays perl

我有一个包含使用此语法的参数的文件

RANGE {<value> | <value>-<value>} [ , ...]

在哪里 value s 是数字。

例如,所有这些都是有效的语法
RANGE 34
RANGE 45, 234
RANGE 2-99
RANGE 3-7, 15, 16, 2, 54

如何将值解析为 Perl 中的数组?

例如,对于最后一个示例,我希望我的数组具有 3, 4, 5, 6, 7, 15, 16, 2, 54 .元素的顺序无关紧要。

最基本的方法是检查 -判断是否存在范围的符号,使用循环解析范围,然后解析其余元素
my @arr;
my $fh, "<", "file.txt" or die (...);
while (<$fh>) {
    if ($_ =~ /RANGE/) {
        if ($_ =~ /-/) { # parse the range
            < how do I parse the lower and upper limits? >
            for($lower..$upper) {
                $arr[++$#arr] = $_;
            }
        } else { # parse the first value
            < how do I parse the first value? >
        }

        # parse the rest of the values after the comma
        < how do I parse the values after the comma? >
    }
}
  • 我需要帮助解析数字。 对于解析,我能想到的一种方法是使用连续拆分(在 -, 上)。有没有更好的(干净优雅,可能使用正则表达式?)方式?
  • 此外,欢迎对整体程序结构提出意见/建议。
  • 最佳答案

    看看 Text::NumericList 来自 CPAN 的模块。它可以以您需要的类似方式将字符串转换为数组:

    use Text::NumericList;
    my $list = Text::NumericList->new;
    
    $list->set_string('1-3,5-7');
    my @array = $list->get_array;     # Returns (1,2,3,5,6,7)
    

    您至少可以查看其源代码以获取想法。

    关于arrays - 如何将此语法解析为 Perl 中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3763843/

    相关文章:

    java - 用作垃圾收集的同步锁的对象数组

    c# - 为什么数组大小声明使用 "1"作为第一个索引?

    perl - 为什么Perl的URI提示“无法通过包URI::_ generic找到对象方法” host”?

    linux - 我如何在 Perl 中接受多个 TCP 连接?

    perl - 有人试图通过 PCOMM 或 x3270 使用 Perl 执行自动化任务吗?

    Python/Numpy : How to avoid storing Boolean-indexed sub-arrays?

    c# - 从 C# 调用不安全的 C++ 时出现 System.AccessViolationException

    arrays - 如何在 Swift 3 中将十六进制转换为十进制? (没有第三方库和Foundation的自写代码)

    perl - 维护哈希值的哈希值中的顺序,并输出为 .csv

    perl - 如何将变量数组存储在另一个数组中?