Perl从字符串中捕获的数字总是1
在我开始学习perl的旅程中 我遇到了这种奇怪的行为,似乎无法理解Perl从字符串中捕获的数字总是1,perl,digits,Perl,Digits,在我开始学习perl的旅程中 我遇到了这种奇怪的行为,似乎无法理解 my $username = "bandit0"; my $command = ""; sub next_command { my ($user) = @_; my $num = $user =~ /(\d+)/; print "$num\n"; if ($num == 0){ return "cat readme"; } elsif ($num == 1){
my $username = "bandit0";
my $command = "";
sub next_command {
my ($user) = @_;
my $num = $user =~ /(\d+)/;
print "$num\n";
if ($num == 0){
return "cat readme";
}
elsif ($num == 1){
return "ls";
}
}
sub next_level {
my ($user) = @_;
my $num = $user =~ /(\d+)/;
$user =~ s/\d//g;
$user = $user . $num++;
return $user;
}
$command = next_command($username);
print $command . "\n";
$username = next_level($username);
$command = next_command($username);
print $command . "\n";
在运行这个小型perl程序之后,我希望出现如下情况:
0
cat readme
1
ls
但是我得到了这样的东西
1
ls
1
ls
我不明白为什么,在第一个字符串
0
时,$num
将是1
而不是0
您可以尝试一下,看看它是否有效。如果有帮助,我会解释一切。我现在无法亲自测试
use strict; # always use strict
use warnings; # always use warnings
my $username = "bandit0"; #try bandit1 to ensure it prints 1 and ls instead
my $command = "";
sub next_command {
my ($user) = @_;
my ($num) = $user =~ /(\d+)/;
print "$num\n";
if ($num == 0){
return "cat readme";
}
elsif ($num == 1){
return "ls";
}
}
sub next_level {
my ($user) = @_;
my ($num) = $user =~ /(\d+)/;
$user =~ s/\d//g;
$user = $user . ++$num;
return $user;
}
$command = next_command($username);
print $command . "\n";
$username = next_level($username);
$command = next_command($username);
print $command . "\n";
你可以试试看它是否有效。如果有帮助,我会解释一切。我现在无法亲自测试
use strict; # always use strict
use warnings; # always use warnings
my $username = "bandit0"; #try bandit1 to ensure it prints 1 and ls instead
my $command = "";
sub next_command {
my ($user) = @_;
my ($num) = $user =~ /(\d+)/;
print "$num\n";
if ($num == 0){
return "cat readme";
}
elsif ($num == 1){
return "ls";
}
}
sub next_level {
my ($user) = @_;
my ($num) = $user =~ /(\d+)/;
$user =~ s/\d//g;
$user = $user . ++$num;
return $user;
}
$command = next_command($username);
print $command . "\n";
$username = next_level($username);
$command = next_command($username);
print $command . "\n";
标量上下文中的匹配运算符计算为布尔值,指示匹配是否成功
my $success = $user =~ /(\d+)/;
列表上下文中的匹配运算符在成功时返回捕获的字符串(如果没有捕获,则返回1
),在出错时返回空列表
my ($num) = $user =~ /(\d+)/;
你用了前者,但你想要后者。这将为您提供以下内容(经过一些其他小修复):
但这种方法既复杂又低效。更简单的解决方案:
sub next_level {
my ($user) = @_;
$user =~ s/(\d+)\z/ $1 + 1 /e;
return $user;
}
标量上下文中的匹配运算符计算为布尔值,指示匹配是否成功
my $success = $user =~ /(\d+)/;
列表上下文中的匹配运算符在成功时返回捕获的字符串(如果没有捕获,则返回1
),在出错时返回空列表
my ($num) = $user =~ /(\d+)/;
你用了前者,但你想要后者。这将为您提供以下内容(经过一些其他小修复):
但这种方法既复杂又低效。更简单的解决方案:
sub next_level {
my ($user) = @_;
$user =~ s/(\d+)\z/ $1 + 1 /e;
return $user;
}
我必须做
$num+=1
和$user=$user$num代码>出于某种原因。但是,是的,括号是我错过的。这应该可以很好地工作,而不必执行$num+=1代码>但是好的,如果你成功了,那么它就可以删除答案。num++
将返回bandit00
而不是bandit1
,我真的不知道;正如我所说,我不知道为什么。刚开始学习perl;)$num++
的问题是,它返回增量之前的$num
值$num+1
如果您以后不需要它就可以了,否则使用++$num
我必须执行$num+=1
和$user=$user$num代码>出于某种原因。但是,是的,括号是我错过的。这应该可以很好地工作,而不必执行$num+=1代码>但是好的,如果你成功了,那么它就可以删除答案。num++
将返回bandit00
而不是bandit1
,我真的不知道;正如我所说,我不知道为什么。刚开始学习perl;)$num++
的问题是,它返回增量之前的$num
值$num+1
如果您以后不需要它就可以了,否则使用+$num
我认为可以使用替代品吗?你能详细说明一下更简单的版本吗。因为对我来说,它的作用并不是那么明显。用$1
(捕获的字符串(数字))和1
的总和来替换尾随数字(\d+\z
)。我觉得用替换法会让人印象深刻吗?你能详细说明一下更简单的版本吗。因为对我来说,它的作用并不明显。用$1
(捕获的字符串(数字))和1
的总和替换尾随数字(\d+\z
)。