2017-11-15 18 views
0

있으며, 그 주위에 내 머리를 정리하고 수없는 것.펄 캡처 한 자리 <p></p> 나는이 재미있는 동작을 발생 ... <code>perl</code> 학습을 시작하는 나의 여행에 항상 1

나는 이런 식으로 뭔가를 얻을 그러나
0 
cat readme 
1 
ls 

...

1 
ls 
1 
ls 

나는 이유를 이해하지 않습니다

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"; 

이 작은 펄 프로그램을 실행 한 후, 나는 이런 식으로 뭔가를 기대 , 처음에 문자열 bandit0$num0

대신에 1이됩니다.
+3

'내 ($ 인분) = $ 사용자 = ~/(\ D +)/내가해야 할 일을했을'http://www.perlmonks.org/?node_id=291543 – toolic

답변

3

스칼라 문맥에서 일치 연산자는 검색 성공 여부를 나타내는 불리언 평가.

my $success = $user =~ /(\d+)/; 
리스트 문맥에서 경기 운영자가 캡처 한 문자열을 반환

성공 및 오류의 빈 목록 (또는 1는 더 캡처가없는 경우).

my ($num) = $user =~ /(\d+)/; 

전자를 사용했지만 후자를 사용했습니다. 그러면 몇 가지 작은 수정을 거쳐 다음과 같이됩니다.

sub next_level { 
    my ($user) = @_; 
    my ($num) = $user =~ /(\d+)\z/; 
    $user =~ s/\d+\z//g; 
    $user .= ++$num; 
    return $user; 
} 

그러나 이러한 방법은 복잡하고 비효율적입니다. 간단한 해결책 :

sub next_level { 
    my ($user) = @_; 
    $user =~ s/(\d+)\z/ $1 + 1 /e; 
    return $user; 
} 
+0

인상적입니다. 어쩌면 간단한 버전에 대해 자세히 설명해 주시겠습니까? 왜냐하면 나에게 그것이 무엇을하는지 분명하지 않기 때문이다. – Ludisposed

+1

후행 숫자 ('\ d + \ z')를'$ 1' (캡쳐 된 문자열 (숫자))와'1'의 합으로 대체합니다. – ikegami

2

이것을 시도해보고 효과가 있는지 확인할 수 있습니다. 도움이된다면 모든 것을 설명해 드리겠습니다. 나는 지금 이것을 직접 시험 할 수 없다.

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"; 
+0

를 참조'$ num + = 1;'및'$ user = $ user. $ num;'어떤 이유로. 그러나 예 괄호는 내가 놓친 것입니다. – Ludisposed

+0

이 작업은'$ num + = 1; ... '하지만 괜찮 았으면 대답을 지울 것입니다. –

+0

'num ++ '는'bandit1' 대신에'bandit00'을 되돌려 주겠다고 말했고, 나는 정말로 돈이 없었습니다. 그냥 펄 학습을 시작했다;) – Ludisposed