【问题标题】:How do you tokenise / tokenize / split a delimited string in Perl?您如何在 Perl 中标记/标记/拆分分隔字符串?
【发布时间】:2025-12-12 03:25:02
【问题描述】:

你如何分割一个字符串,例如"a:b:c:d" 转换成用于在 Perl 中解析的标记?

(例如使用拆分?)

首先要寻找清晰、直接的答案(但之后一定要添加任何有趣的信息)。

【问题讨论】:

  • 你没有花时间阅读man perlfunc吗?那里甚至有例子!例如:print join(':', split(/,/, 'a,b,c,,,')), "\n";

标签: perl split token


【解决方案1】:

您可以使用拆分。您也可以将其与正则表达式一起使用。


my @tokens = split(/:/,$string);

更高级的解析,推荐Parse::RecDescent

【讨论】:

  • 注意 split() 也接受一个字符串作为第一个参数,在这种情况下它只是一个简单的字符串更有效。 split(':', $string)
  • @mpeters:不,它仍然是一个正则表达式。尝试拆分“。”,“ab.cd”; “。”匹配任何字符。而使用由单个空格组成的字符串“”是一种特殊情况,并不意味着“匹配单个空格”
  • @mpeters:split 让您可以使用引号(单引号或双引号)作为正则表达式分隔符,而不使用前面的“m”作为通常的正则表达式运算符。
  • V 又好又简单,将采用 foreach 答案,因为这对初学者来说非常方便。
【解决方案2】:

如果你有:

$a = "a:b:c:d";
@b = split /:/, $a;

然后你得到:

@b = ("a", "b", "c", "d")

一般来说,拆分是这样工作的:

split /PATTERN/,EXPR

PATTERN 几乎可以是正则表达式。您不仅限于像“:”这样的简单标记

【讨论】:

    【解决方案3】:

    是的,split 就是你想要的。

    @tokens = split(/:/, "a:b:c:d");
    foreach my $token (@tokens) {
        ....
    }
    

    【讨论】:

    • foreach 我的 $token (@tokens) {} 我的!我的!我的:)
    • 如果您想标记一个包含简单数学表达式的字符串,并且还需要考虑数学运算符可以直接附加到操作数而没有任何空间来分隔它们的事实,该怎么办?例如 'x= 3*2' ... 有没有办法(除了多次调用以使用不同的分隔符序列进行拆分)让每个操作数和运算符作为单独的标记返回?
    • 没关系,显然有(从 perldoc 中提取): split(/(-)|(,)/, "1-10,20", 3) -> ('1', '- ', undef, '10', undef, ',', '20')
    【解决方案4】:

    还可以通过在命令行提示符下键入来查看 perl 附带的文档:

    perldoc -f split
    

    要搜索常见问题,请使用

    perldoc -q split
    

    【讨论】: