0

我对我的字符串 $text 做了以下操作

$text =~ tr/a-zåàâäæçéèêëîïôöœßùûüÿA-ZÅÀÂÄÆÇÉÈÊËÎÏÔÖŒÙÛÜŸ'()\-,.?!:;/\n/cs;

这样做是将字符串拆分为换行符。这就是我想做的

但我不明白为什么会这样?

我认为这条线会占用所有字符 a-zåàâäæçéèêëîôöœßùûüÿA-ZÅÀÂÄÆÇÉÈÊËÎÏÔÖŒÙÛÜŸ'()-,.?!:; 并用 \n 替换它们中的每一个

我也不明白 cs 到底做了什么。在这里你可以得到对 cs 的解释,但我不明白它是什么意思:

"c - 用于指定 SEARCHLIST 字符集被补码"

“s - 用于指定音译为相同字符的字符序列被压缩为字符的单个实例”

例子:

$text= "a ar? å ..";

一个

Ø
..

4

3 回答 3

5

c - 用于指定对 SEARCHLIST 字符集进行补码

在这种用法中,“互补”类似于“否定”或“反转”,因此不是替换表达式中列出的字符,而是替换表达式中找到的每个字符。在您的示例字符串中,这意味着所有空格都被换行符替换,因为每个其他字符都包含在集合中。

于 2013-09-11T21:56:07.843 回答
4

如果你想把所有的空格都变成换行符,列出所有不是空格的东西是很麻烦的,你可能会忘记一些。您可以改为使用正则表达式直接处理空格。

s{\s+}{\n}g;

s{...}{...}是使用正则表达式而不仅仅是字符的“搜索和替换”。 \s正则表达式代表“空白”,其中包括空格、制表符和换行符。 +表示要匹配其中的一个或多个,因此一行中的多个空格将变成一个换行符。修饰符表示“全局”或跨字符串中的每个字符执行此g操作,否则它将在第一次匹配时停止。

foo bar     baz

变成

foo
bar
baz
于 2013-09-11T22:02:19.563 回答
3

"c - 用于指定 SEARCHLIST 字符集被补码"

这意味着它将用 替换任何不在搜索列表中的内容\n。在您的示例中,唯一不在搜索列表中的字符是空格。因此,每个空格都被换行符替换。正如 Schwern指出的那样,这不是一个好方法。

“s - 用于指定音译为相同字符的字符序列被压缩为字符的单个实例”

这意味着如果连续三个字符被翻译(导致\n连续三个),这三个\n将被“压扁”成一个\n. 如果您在示例输入中添加了一些空格,您可以看到它的实际效果:

# Multiple spaces separating words
my $str = "a   ar?  å";

没有挤压:

$str =~ tr/a-zåàâäæçéèêëîïôöœßùûüÿA-ZÅÀÂÄÆÇÉÈÊËÎÏÔÖŒÙÛÜŸ'()\-,.?!:;/\n/c;

输出:

a



ar?


å

挤压:

$str =~ tr/a-zåàâäæçéèêëîïôöœßùûüÿA-ZÅÀÂÄÆÇÉÈÊËÎÏÔÖŒÙÛÜŸ'()\-,.?!:;/\n/cs;

输出:

a
ar?
å
于 2013-09-11T21:55:23.683 回答