gpt4 book ai didi

regex - Perl 正则表达式 : when to use $&

转载 作者:行者123 更新时间:2023-12-05 08:24:14 26 4
gpt4 key购买 nike

我正在学习 perl 和正则表达式。以下代码:

my $data = "Bule beatles battling a blowing breeze";
my $results = $data =~ m/beatles battling/;
print "results: $results\n";

产生这个输出:

C:\scripts\perl\sandbox>regex.pl
results: 1

通过一个小改动,我得到了我想要的结果:

print "results: $&\n";
results: beatles battling

我还注意到我不需要创建 $results:

my $data = "Bule beatles battling a blowing breeze";
$data =~ m/beatles battling/;
print "results: $&\n";

在我阅读的各种 perl 教程中,一些示例使用以下语法:

my $results = $data =~ m/string_to_match/;

我的问题:

  • 什么时候应该创建 $results 而不是直接对 $data 执行正则表达式?
  • 为什么我尝试打印 $data 时返回“1”? (我认为它正在返回匹配的长度...)
  • 创建 $results 有用吗?如果不是,我将如何处理多个结果?

例如:

my $data = "Bule beatles battling a blowing breeze";
my $results1 = $data =~ m/beatles/;
my $results2 = $data =~ m/battling/;

非常感谢:)

最佳答案

标量上下文 中的正常正则表达式匹配返回一个 bool 值,指示模式是否匹配。它不返回匹配的子字符串(效率低下!)。

要访问匹配的子字符串,请将模式括在括号中。该模式的内容随后在 $1 中可用,或者作为 list context 中的第一个返回值:

my $data = "Bule beatles battling a blowing breeze";
my ($result) = $data =~ /(beatles battling)/;
say $result;

输出:披头士乐队战斗

如果您的模式中有更多捕获,它们的内容将在 $2$3 中,...。您还可以通过列表上下文访问它们:

my ($substring, $beatles, $battling) = $data =~ /((beatles) (battling))/;

永远不要使用 $&,除非是在打高尔夫球时,或者在效率或风格不成问题的单类机上。

$& 等的使用会在全局范围内对所有模式匹配施加开销。你不想要那个。

关于regex - Perl 正则表达式 : when to use $&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com