代码不会从变量中删除非 ascii 字符
Code does not remove non-ascii characters from variable
为什么以下代码行没有从我的变量中删除非 ascii 字符并用单个 space 替换它?
$text =~ s/[[:^ascii:]]+/ /rg;
$text =~ s/\h+/ /g;
虽然这可以删除换行符?
$log_mess =~ s/[\r\n]+//g;
为以后发现此问题的任何人解释问题:
$text =~ s/[[:^ascii:]]+/ /rg;
问题出在替换运算符 (s/.../.../
) 上的 /r
选项。
此运算符记录在 "Regexp Quote-Like Operators" section of perlop 中。它说的是 /r
:
r - Return substitution and leave the original string untouched.
您会看到,在大多数情况下,替换运算符作用于给定的字符串(例如您的变量 $text
),但在某些情况下,您不希望这样。在某些情况下,您希望原始变量保持不变并返回更改后的字符串,以便您可以将其存储在新变量中。
以前,您会这样做:
my $new_var = $var;
$new_var =~ s/regex/substitution/;
但是由于添加了 /r
选项,您可以将其简化为:
my $new_var = $var =~ s/regex/substitution/r;
我不确定你为什么在你的代码中使用 /r
(我猜你是从其他地方复制的),但你在这里不需要它,这就是导致你的原始字符串的原因不变。
为什么以下代码行没有从我的变量中删除非 ascii 字符并用单个 space 替换它?
$text =~ s/[[:^ascii:]]+/ /rg;
$text =~ s/\h+/ /g;
虽然这可以删除换行符?
$log_mess =~ s/[\r\n]+//g;
为以后发现此问题的任何人解释问题:
$text =~ s/[[:^ascii:]]+/ /rg;
问题出在替换运算符 (s/.../.../
) 上的 /r
选项。
此运算符记录在 "Regexp Quote-Like Operators" section of perlop 中。它说的是 /r
:
r - Return substitution and leave the original string untouched.
您会看到,在大多数情况下,替换运算符作用于给定的字符串(例如您的变量 $text
),但在某些情况下,您不希望这样。在某些情况下,您希望原始变量保持不变并返回更改后的字符串,以便您可以将其存储在新变量中。
以前,您会这样做:
my $new_var = $var;
$new_var =~ s/regex/substitution/;
但是由于添加了 /r
选项,您可以将其简化为:
my $new_var = $var =~ s/regex/substitution/r;
我不确定你为什么在你的代码中使用 /r
(我猜你是从其他地方复制的),但你在这里不需要它,这就是导致你的原始字符串的原因不变。