당신이 이동합니다. Perl v5.10에서 v5.14까지 테스트되었습니다. 키는 재귀 패턴이며 여기에서 우리는 (?&Sequence)
규칙을 재귀합니다. 이것은 유도에 의한 증거의 일부입니다.
bigint
은 실제로 1 .. 10**10_000
에서 시퀀스를 생성하고자하는 경우에 대비해 제공됩니다. 플랫폼에 따라 32 비트 또는 64 비트 시스템 고유의 int로 제한 할 수 있으면 상당히 빠르게 실행됩니다. 실행이 생산
#!/usr/bin/env perl
use v5.10;
use bigint; # only if you need stuff over maxint
my $pat = qr{
^
(?= 1 \b)
(?<Sequence>
(?<Number> \d+)
(?:
\s+
(??{ "(?=" . (1 + $+{Number}) . ")" })
(?&Sequence)
)?
)
$
}x;
# first test embedded data
while (<DATA>) {
if (/$pat/) {
print "PASS: ", $_;
} else {
print "FAIL: ", $_;
}
}
# now generate long sequences
for my $big (2, 10, 25, 100, 1000, 10_000, 100_000) {
my $str = q();
for (my $i = 1; $i <= $big; $i++) {
$str .= "$i ";
}
chop $str;
if ($str =~ $pat) {
print "PASS: ";
} else {
print "FAIL: ";
}
if (length($str) > 60) {
my $len = length($str);
my $first = substr($str, 0, 10);
my $last = substr($str, -10);
$str = $first . "[$len chars]" . $last;
}
say $str;
}
__END__
5
fred
1
1 2 3
1 3 2
1 2 3 4 5
1 2 3 4 6
2 3 4 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 4 5 6 6
:
FAIL: 5
FAIL: fred
PASS: 1
PASS: 1 2 3
FAIL: 1 3 2
PASS: 1 2 3 4 5
FAIL: 1 2 3 4 6
FAIL: 2 3 4 6
PASS: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
FAIL: 1 2 3 4 5 6 6
PASS: 1 2
PASS: 1 2 3 4 5 6 7 8 9 10
PASS: 1 2 3 4 5 [65 chars]2 23 24 25
PASS: 1 2 3 4 5 [291 chars] 98 99 100
PASS: 1 2 3 4 5 [3892 chars]8 999 1000
PASS: 1 2 3 4 5 [588894 chars]999 100000
을 이기적를 보이는 위험에는 이런 종류의 물건을 커버 a book있다. 제 5 장 "팬시 패턴"에 대한 내용은 프로그래밍 Perl, 4ᵗʰ edition을 참조하십시오. "명명 된 그룹", "재귀 패턴"및 "문법 패턴"에 대한 새로운 섹션을 확인하십시오. 이 책은 프린터에 있으며 하루나 이틀 안에 전자 방식으로 사용할 수 있어야합니다.
글쎄, Perl의 정규식 ('$ {...}) '과'(? C ...)'을 통한 PCRE)은 임의의 코드를 실행할 수 있습니다. 너는 그걸 원하지 않는다고 생각 하나? 그렇지 않으면 문제는 꽤 사소한 것입니다 ... –
@ KonradRudolph 재귀로 해결할 것입니다. – tchrist
@tchrist 어쨌든 재귀가 필요합니다. 그러나 코드 실행없이 어떻게 할 것입니까? –