问题 Perl - 从输入字符串中获取第一个“单词”


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

主循环看起来像这样:

while(<AXM60FILE>) {

   $inputline = $_;

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

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

}

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

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

param1:xxxxxxxxxxxx
  param2:xxxxxxxxxxxxx
  param3:xxxxxxxxxxxxxxxxx
  param4:XXXXXXXXXXXXX

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

另外,如果“空白”是一个或多个标签,而不是空格/空格字符呢?

谢谢, 吉姆


1385
2018-02-11 19:34


起源

定义'单词':英语单词,程序标识符,非空格的空格有界块,字母表,字母数字等。 - tchrist


答案:


这将涵盖您的所有案例,然后是:

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

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


9
2018-02-11 19:46





($start) = $inputline =~ /\A([^:\s]+)/;

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

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

6
2018-02-11 19:43



eugene,谢谢!! - user555303
Eugene,我一直在使用你的第一个建议进行更多测试,并想确认:通过'空白',是否包括标签字符?另外,您能简单解释一下您使用的正则表达式是如何工作的吗?吉姆 - user555303
嗨,我想我有点不清楚的是有一个\ A,这是字符串的开头,而插入符号^,我认为是一个锚点。是不是都使用冗余?吉姆 - user555303
@ user555303:看 perlretut: \s 匹配空白字符集 [\ \t\r\n\f] 和别的。特殊的性格 ^ 在字符类的第一个位置表示一个否定的字符类,它匹配任何字符,但括号中的字符。 - Eugene Yarmash
感谢您的解释!吉姆 - user555303