Regex 查询在reqex中使用\w

Regex 查询在reqex中使用\w,regex,perl,Regex,Perl,下面的perl脚本将整个字符串打印为输出,但我希望输出为perl。我对perl和regex都是新手。有人能解释一下为什么我没有得到预期的输出吗 my $txt='I am learning Perl'; $txt=~/(\w+)$/; print $txt; 产出 我正在学习Perl 我期望的输出: Perl 据我所知,输出应该是一个包含一个或多个字母数字字符的单词,对模式的搜索从结尾开始。我不明白我的错误在哪里。$txt不会被匹配操作修改 但是您会得到一个新变量$1,它包含第一个捕获组的内

下面的perl脚本将整个字符串打印为输出,但我希望输出为perl。我对perl和regex都是新手。有人能解释一下为什么我没有得到预期的输出吗

my $txt='I am learning Perl'; 
$txt=~/(\w+)$/;
print $txt;
产出

我正在学习Perl

我期望的输出:

Perl


据我所知,输出应该是一个包含一个或多个字母数字字符的单词,对模式的搜索从结尾开始。我不明白我的错误在哪里。

$txt
不会被匹配操作修改


但是您会得到一个新变量
$1
,它包含第一个捕获组的内容(在您的示例中,它包含
'Perl'

不会被匹配操作修改


但是您会得到一个新变量
$1
,它包含第一个捕获组的内容(在您的示例中,它包含
'Perl'

正则表达式匹配不会修改该变量。它根据上下文返回匹配列表或布尔值

在列表上下文中使用它来捕获匹配项

my $txt='I am learning Perl'; 
my ($match) = $txt=~/(\w+)$/;
print $match;

正则表达式匹配不会修改变量。它根据上下文返回匹配列表或布尔值

在列表上下文中使用它来捕获匹配项

my $txt='I am learning Perl'; 
my ($match) = $txt=~/(\w+)$/;
print $match;


如果正则表达式没有
/g
修饰符,是否会有一个匹配列表?@TimPietzcker-是的,因为可以有(a)多个捕获组,并且(b)一个列表中可以只有一个项目,但仍然是一个列表(这是后一个示例),因为它返回一个列表,如果您将上面的代码更改为标量上下文中的,则返回一个列表(即
my$match=
而不是
my($match)=
),那么输出将是
1
(列表的长度),而不是
Perl
(列表中标量的值).@Quentin这是错误的。
m//
在标量上下文中返回一个布尔结果,而不是长度。哇,确实如此。显示了我在标量上下文中使用捕获正则表达式的频率。如果正则表达式没有
/g
修饰符,是否可以有一个匹配列表?@TimPietzcker-是的,因为可以有(a)多个捕获组和(b)一个列表中可以只有一个项目,但仍然是一个列表(这是后者的一个示例),因为它返回一个列表,如果您将上述代码更改为标量上下文(即
my$match=
而不是
my($match)=
),那么输出将是
1
(列表的长度)而不是
Perl
(列表中标量的值)。@Quentin这是错误的。
m/
在标量上下文中返回一个布尔结果,而不是长度。哎呀,是这样。显示了我在标量上下文中捕获正则表达式的频率。将“print$txt”替换为“print$1”将“print$txt”替换为“print$1”不要使用
$&
;它会减慢所有正则表达式匹配的速度。@melpomene:有趣。它是如何减慢速度的?@TimPietzcker:引用:在程序中的任何位置使用此变量都会对所有正则表达式匹配造成相当大的性能损失。为了避免这种损失,可以使用
@-
提取相同的子字符串。从Perl 5.10开始,可以使用
/p
匹配标志和
${^match}
变量对特定的匹配操作执行相同的操作。“
$&
是全局的,因此如果解析器看到您在任何地方使用它,则每个匹配操作都必须设置它(因为perl在编译时无法告诉您将如何使用它)。这意味着每个正则表达式匹配都将创建目标字符串的副本。@melpomene,Zaid:谢谢你的解释。奇怪的是,
$1
的情况并非如此。我必须承认,我无法理解为什么
$&
是全局的,
$1
不是…不要使用
$&
;它会使所有正则表达式匹配都变慢。@melpomene:I有趣。它是如何减慢速度的?@TimPietzcker:引用:在程序中的任何位置使用此变量都会对所有正则表达式匹配造成相当大的性能损失。为了避免这种损失,可以使用
@-
提取相同的子字符串。从Perl 5.10开始,可以使用
/p
匹配标志和
${^match}
变量对特定的匹配操作执行相同的操作。“
$&
是全局的,因此如果解析器看到您在任何地方使用它,则每个匹配操作都必须设置它(因为perl在编译时无法告诉您将如何使用它)。这意味着每个正则表达式匹配都将创建目标字符串的副本。@melpomene,Zaid:谢谢你的解释。奇怪的是,
$1
不是这样。我必须承认我不理解为什么
$&
是全局的而
$1
不是。。。