Perl从字符串中捕获的数字总是1

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){

在我开始学习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){
        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
)。