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
控制分隔符號和特殊字元的處理方式
如果為真,則令牌會依據指定的區隔符號進行分割,但所有其他字元(包括引號和反斜線)都保留在令牌中。
如果 $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>
示範
一個簡單的字
多個空白會因為我們的 $delim 而被跳過
使用引號在字中包含空白
使用反斜線在字中包含空白
使用反斜線移除雙引號的特殊意義
另一個簡單的字(注意反斜線雙引號沒有效果)
用 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 相同的條款下重新散布和/或修改它。