URL 参数的正则表达式匹配

REgex match for URL parameter

我正在尝试提取磁铁的名称 link。这是我的代码:

use strict;
use warnings;
use v5.18.0;

my $link = 'magnet:?xt=urn:btih:CD46E14A7D62A85607D0F38F0CEE6EE7FEA34209&dn=inherent+vice+2014+dvdscr&tr=udp%3A%2F%2Fexplodie.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337';

$link =~ m/dn=(.*)&/;
my $link_text = ;
say $link_text;

生成的 $link_text 包含捕获组后的字符: inherent+vice+2014+dvdscr+xvid+ac3+evo&tr=udp%3A%2F%2Finferno.demonoid.ph%3A3389%2Fannounce

我可以通过后续替换去除尾随参数:

$link_text =~ s/&.*//;
say $link_text;

returns 我在找什么: inherent+vice+2014+dvdscr

我在第一个正则表达式中做错了什么?

* 是一个 greedy 运算符,这意味着它将尽可能多地匹配,并且仍然允许匹配正则表达式的其余部分。使用 *? 表示非贪婪匹配,意思是 "zero or more — preferably as few as possible"。

dn=(.*?)&