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

10

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

主要循环如下:

while(<AXM60FILE>) {

   $inputline = $_;

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

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

}
输入文件实际上是一个参数文件,其中参数名和参数值由冒号(“:”)分隔。在冒号之前或之后可以有空格或制表符。
所以,该文件看起来(例如)如下: param1: xxxxxxxxxxxx
param2 :xxxxxxxxxxxxx
param3 : xxxxxxxxxxxxxxxxx
param4:xxxxxxxxxxxxx
对于“param2”示例和第一个单词以空格结束的“param3”示例,“($start) = ($inputline =~ /\A(.*?) /);" 可以正常工作,但我如何处理参数名称紧接着冒号的“param1”和“param4”情况呢?
此外,如果“空格字符”的是一个制表符或多个制表符,该怎么办?
谢谢, Jim

定义“单词”:英语单词,程序标识符,非空白字符块,字母、数字等。 - tchrist
2个回答

8
这将涵盖您的所有情况,甚至更多:
my ($key, $value) = split /\s*:\s*/, $inputline, 2;

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

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

这将匹配除了行首的空格和冒号以外的任何字符。
或者使用 split

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

尤金,我已经使用您的第一个建议进行了更多测试,并想确认:在“空格”中是否包括制表符?此外,您能简要解释一下您使用的正则表达式是如何工作的吗?吉姆 - user555303
嗨,我有点不清楚的是同时使用\A和脱字符^,\A是用于字符串的开头,而脱字符^是用于锚定。这两个一起使用不是多余的吗?Jim - user555303
@user555303:请参考perlretut\s匹配空格字符,集合[\ \t\r\n\f]和其他字符。字符类的第一个位置上的特殊字符^表示否定字符类,它匹配除括号内字符以外的任何字符。 - Eugene Yarmash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接