我正在阅读Learning Perl(第6版)并找到了一段我无法解读的代码片段。第14章之后的一个练习要求构建一个程序,该程序将字符串和子字符串作为输入,然后查找字符串中出现子字符串的索引。
这就是我做的方式:
print "Enter a string: ";
chomp($string = <STDIN>);
print "Enter a substring: ";
chomp($sub = <STDIN>);
until ($index == -1) {
print $index, "\n" if defined($index);
$index = index($string, $sub, $index + 1);
}
在答案部分,他们展示了两种方式。一个很容易理解,与我的相似,但另一个是有目的地混淆:
print "Enter a string: ";
chomp($string = <STDIN>);
print "Enter a substring: ";
chomp($sub = <STDIN>);
for (my $pos = –1; –1 !=
($pos = index
+$string,
+$sub,
+$pos
+1
);
push @places, ((((+$pos))))) {
'for ($pos != 1; # ;$pos++) {
print "position $pos\n";#;';#' } pop @places;
}
print "Locations of '$sub' in '$string' were: @places\n";
我几乎不知道for循环中发生了什么。我知道for (initialize; test; increment)
形式,并且它正在测试索引不是-1,这意味着不再出现子字符串。但是对于$ pos的任务是怎么回事?为什么+ $ pos附近有这么多括号?许多括号后发生了什么?如果有人可以引导我完成第二部分,我真的很感激。请记住,我一周前刚刚开始学习Perl。
BTW,我尝试运行他们的代码,但它给了我这个错误:
Unrecognized character \xE2; marked by <-- HERE after my $pos = <-- HERE near column 16 at ex14.obfs.pl line 1.
答案 0 :(得分:4)
我已经简化了你的例子,丢弃了无用的垃圾和评论。希望现在很明显发生了什么:
print "Please enter a string: ";
chomp(my $string = <STDIN>);
print "Please enter a substring: ";
chomp(my $sub = <STDIN>);
my @places;
for (my $pos = -1; -1 != ($pos = index $string, $sub, $pos+1); push @places, $pos)
{
#do nothing here
}
print "Locations of '$sub' in '$string' were: @places\n";
编译错误是由于&#39; - &#39;而不是&#39; - &#39 ;; 内部循环实际上是一个字符串文字(无用)加上注释(无用),额外的括号也没用。