У меня есть следующий метод в классе действий, который хорошо работал в Rakudo 2016.07, но я только что установил 2016.11, и теперь новый Rakudo говорит, что мой метод пытается назначить переменную только для чтения, и я просто не вижу проблемы:
method ptName ($/) {
my $nameStr = $/.Str, my $lastName, my $firstName;
my $newMatch # this is line 182;
# Cannot assign to a readonly variable or a value
= $nameStr.match(/ \" (<alpha>+) .*? \, \s* (<alpha>+) .*? \" /);
$lastName = $newMatch[0];
$firstName = $newMatch[1];
make "$lastName $firstName";
}
Все сообщение об ошибке
Cannot assign to a readonly variable or a value
in method ptName at /home/lisprog/Binary/grammar.pl line 182
in regex ptName at /home/lisprog/Binary/grammar.pl line 151
in regex TOP at /home/lisprog/Binary/grammar.pl line 137
in block <unit> at /home/lisprog/Binary/grammar.pl line 217
Какая языковая спецификация изменилась? Пожалуйста помоги. Спасибо.
=====================================================
Спасибо райф, Кристоф, ZZ!! Я не знаю, как добавить длинный комментарий с правильным форматированием. Итак, я добавляю комментарии к своему сообщению.
Я написал тестовую программу, и теперь кажется, что если я не использую ($/) в сигнатуре метода, потому что мне нужно использовать .match внутри метода, я больше ничего не смогу сделать. Что я сделал не так? Вот тестовая программа и результаты:
Программа испытаний:
grammar test {
regex TOP { <foo><bar> }
regex foo { :i \s* foo \s* }
regex bar { :i \s bar \s* }
}
class actTest {
method foo ($x) { # program fails if I use $/ in signature
print "1 "; say $x; # how to combine the 2 and show $x as match?
print "2 "; say $x.WHAT;
my $newStr = $x.Str;
print "3 "; say $newStr;
my $newMatch
= $newStr.match(/:i(f)(oo)/); # adverb cannot be outside?
print "4 "; say $newMatch.WHAT;
print "5 "; say $newMatch;
print "6 "; say $/;
my $oo = $newMatch[1].Str;
print "10 "; say $oo;
my $f = $newMatch[0].Str;
print "11 "; say $f;
my $result = $oo ~ $f;
print "12 "; say $result;
make $result; # now I cannot make anything; huh???
}
method TOP ($/) {
print "8 "; say $<bar>;
print "9 "; say $<foo>.made; # failed, method 'foo' makes nothing
make $<bar> ~ $<foo>.made;
}
}
my $m = test.parse("Foo bar", actions => actTest.new);
print "7 "; say $m;
И результаты:
1 「Foo 」
2 (Match)
3 Foo
4 (Match)
5 「Foo」
0 => 「F」
1 => 「oo」
6 「Foo」
0 => 「F」
1 => 「oo」
10 oo
11 F
12 ooF
1 「Foo」
2 (Match)
3 Foo
4 (Match)
5 「Foo」
0 => 「F」
1 => 「oo」
6 「Foo」
0 => 「F」
1 => 「oo」
10 oo
11 F
12 ooF
8 「 bar」
9 (Any)
Use of uninitialized value of type Any in string context.
Methods .^name, .perl, .gist, or .say can be used to stringify it to
something meaningful.
in method TOP at matchTest.pl line 28
7 「Foo bar」
foo => 「Foo」
bar => 「 bar」
method ptName ($/ is copy) {
? А как насчетmethod ptName ($/ is rw) {
? - person raiph   schedule 06.12.2016