內容

名稱

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 為 false,則 *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

另一個簡單的字(注意反斜線雙引號沒有效果)

shellwords(q{this is...}) 取代 quotewords('\s+', 0, q{this is...}) 是達成相同目的的更簡單方式。

另請參閱

Text::CSV - 用於剖析 CSV 檔案

作者

原始作者不明,但推測是從 Perl 4 中的 shellwords.pl 演變而來。

parse_line() 的大部分程式碼(包括主要的正規表示法)來自 Joerk Behrends <jbehrends@multimediaproduzenten.de>。

範例區段和其他文件由 John Heidemann <johnh@ISI.EDU> 提供。

Hal Pomeranz <pomeranz@netcom.com> 從 1994 年到 1999 年維護此模組,並進行了第一次 CPAN 發布。

Alexandr Ciornii <alexchornyATgmail.com> 從 2008 年到 2015 年維護此模組。

許多其他人也做出了貢獻,特別感謝 Michael Schwern <schwern@envirolink.org> 和 Jeff Friedl <jfriedl@yahoo-inc.com>。

版權和授權

此函式庫是自由軟體;您可以在與 Perl 相同的條款下重新散布和/或修改它。