【发布时间】:2016-04-01 08:33:37
【问题描述】:
我正在阅读 Learning Perl(第 6 版)并遇到了我无法破译的代码 sn-p。第 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。
顺便说一句,我尝试运行他们的代码,但它给了我这个错误:
Unrecognized character \xE2; marked by <-- HERE after my $pos = <-- HERE near column 16 at ex14.obfs.pl line 1.
【问题讨论】:
-
语法错误是因为您没有使用破折号,而是使用了 endash 什么的。删除“-”字符并用“-”字符替换它们
-
for (A; B; C) { D }大致是A; while (B) { D } continue { C },大致是A; while (B) { D; C }
标签: perl