内容

名称

Text::ParseWords - 将文本解析为标记数组或数组数组

概要

use Text::ParseWords;
@lists = nested_quotewords($delim, $keep, @lines);
@words = quotewords($delim, $keep, @lines);
@words = shellwords(@lines);
@words = parse_line($delim, $keep, $line);
@words = old_shellwords(@lines); # DEPRECATED!

描述

nested_quotewords()quotewords() 函数接受一个分隔符(可以是正则表达式)和一个行列表,然后将这些行分解成一个单词列表,忽略出现在引号内的分隔符。quotewords() 在一个长列表中返回所有标记,而 nested_quotewords() 返回一个标记列表列表,对应于 @lines 的元素。parse_line() 对单个字符串进行标记化。*quotewords() 函数只是调用 parse_line(),所以如果你只分割一行,你可以直接调用 parse_line() 并节省一个函数调用。

$keep 控制分隔符和特殊字符的处理方式

true

如果为真,则在指定的分隔符处分割标记,但所有其他字符(包括引号和反斜杠)都保留在标记中。

false

如果 $keep 为假,则 *quotewords() 函数会删除所有未被反斜杠转义或不在单引号内的引号和反斜杠(即,quotewords() 尝试像 Bourne shell 一样解释这些字符)。注意:这些语义与 Perl 5.000 到 5.004 中附带的此模块的原始版本有很大不同。

"delimiters"

作为一项附加功能,$keep 可以是关键字“delimiters”,这会导致函数除了保留引号和反斜杠字符外,还将每个字符串中的分隔符作为标记保留在标记列表中。

shellwords() 是作为 quotewords() 的特例编写的,它使用空格作为分隔符进行标记解析,类似于大多数 Unix shell。

示例

示例程序

use Text::ParseWords;
@words = quotewords('\s+', 0, q{this   is "a test" of\ quotewords \"for you});
$i = 0;
foreach (@words) {
    print "$i: <$_>\n";
    $i++;
}

产生

0: <this>
1: <is>
2: <a test>
3: <of quotewords>
4: <"for>
5: <you>

演示

0

一个简单的词

1

由于我们的 $delim,多个空格被跳过

2

使用引号将空格包含在一个词中

3

使用反斜杠将空格包含在一个词中

4

使用反斜杠删除双引号的特殊含义

5

另一个简单的词(注意反斜杠双引号没有效果)

quotewords('\s+', 0, q{this is...}) 替换为 shellwords(q{this is...}) 是实现相同目的的更简单方法。

另请参阅

Text::CSV - 用于解析 CSV 文件

作者

最初的作者未知,但推测它是由 Perl 4 中的 shellwords.pl 演变而来的。

parse_line() 的大部分代码(包括主要正则表达式)来自 Joerk Behrends <[email protected]>。

示例部分和其他文档由 John Heidemann <[email protected]> 提供。

Hal Pomeranz <[email protected]> 在 1994 年至 1999 年期间维护了它,并进行了第一次 CPAN 发布。

Alexandr Ciornii <alexchornyATgmail.com> 在 2008 年至 2015 年期间维护了它。

许多其他人也做出了贡献,特别感谢 Michael Schwern <[email protected]> 和 Jeff Friedl <[email protected]>。

版权和许可

此库是免费软件;您可以根据与 Perl 本身相同的条款重新分发和/或修改它。