【问题标题】:Perl - get first "word" from input stringperl - 从输入字符串获取第一个“单词”
【发布时间】:2011-06-25 18:51:16
【问题描述】:

我正在尝试编写一个 Perl 程序,它从文本文件中读取行,并且对于每一行,从该行中提取第一个“单词”,并根据返回的字符串执行不同的操作。

主循环如下所示:

while(<AXM60FILE>) {

   $inputline = $_;

   ($start) = ($inputline =~ /\A(.*?) /);

perform something, based on the value of string in $start

}

输入文件实际上是一个参数文件,parameter_name和parameter_value之间用冒号(“:”)隔开。冒号前后可以有空格或制表符。

因此,文件看起来(例如)如下所示:

参数 1:xxxxxxxxxxxx
参数2:xxxxxxxxxxxx
参数 3:xxxxxxxxxxxxxxxxxx
参数4:xxxxxxxxxxxxxxx

那个“($start) = ($inputline =~ /\A(.*?) /);”适用于“param2”示例和“param3”示例,其中第一个单词以空格/空格结尾,但我如何处理“param1”和“param4”情况,其中param_name 后面紧跟冒号?

另外,如果“空白”是一个或多个制表符,而不是空白/空格字符,那该怎么办?

谢谢, 吉姆

【问题讨论】:

  • 定义“单词”:英语单词、程序标识符、非空白的空白块、字母、字母数字等。

标签: perl string regex


【解决方案1】:

这将涵盖您的所有情况,然后是一些:

my ($key, $value) = split /\s*:\s*/, $inputline, 2;

(或者,在英语中,将$inputline 拆分为最多两个元素,由任意数量的空格、冒号和任意数量的空格分隔。)

【讨论】:

    【解决方案2】:
    ($start) = $inputline =~ /\A([^:\s]+)/;
    

    这将匹配除行首的空格和: 之外的任何内容。
    或者使用split:

    ($start) = split /[:\s]+/, $inputline, 2;
    

    【讨论】:

    • Eugene,我一直在使用您的第一个建议进行更多测试,并想确认:通过“空白”,是否包含制表符?另外,您能简要解释一下您使用的正则表达式是如何工作的吗?吉姆
    • 嗨,我想我有点不清楚的是既有 \A,它是字符串的开头,还有插入符号 ^,我认为是一个锚。两者都使用不是多余的吗?吉姆
    • @user555303: 见perlretut: \s 匹配空白字符、集合[\ \t\r\n\f] 等。字符类第一个位置的特殊字符^ 表示否定字符类,它匹配除括号中的字符以外的任何字符。
    • 感谢您的解释!吉姆
    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多