需要帮助理解这个Perl片段

时间:2015-12-27 04:08:29

标签: perl

我正在阅读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.

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 ;; 内部循环实际上是一个字符串文字(无用)加上注释(无用),额外的括号也没用。