【问题标题】:Need help understanding this Perl snippet需要帮助理解这个 Perl 片段
【发布时间】: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


【解决方案1】:

我稍微简化了您的示例,丢弃了无用的垃圾和 cmets。希望现在很清楚发生了什么:

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";

编译错误是由于'-'而不是'-'; 内部循环实际上是字符串文字(无用)加上 cmets(无用),额外的大括号也无用。

【讨论】:

  • 谢谢先生;现在我明白了。您能否解释一下为什么变量名前的 + 号无关紧要?仅仅是因为你什么都没有添加吗?
  • 一元加号有时用于调整语法和引导解析器,从功能的角度来看,它基本上是一个空操作。
  • @A. Raj, Unary + 不执行加法。它实际上什么也没做。它用于消除语法歧义。例如,{ 可以启动一个表达式(哈希构造函数),它可以启动一个块。如果 Perl 猜错了,你可以告诉它你想要哪个。 +{ ... } 将强制将 curly 解释为表达式(因为表达式必须跟在 + 之后),因此作为哈希构造函数。 {; ... } 将被解释为一个块(因为 Perl 会先行查看一个标记,而 ; 可以在哈希构造函数中)。
猜你喜欢
  • 2016-07-08
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多