“连续两项”错误

2024-01-30

我正在尝试编写如下紧凑的行,代码是从使用动态作用域特殊变量 $*IN 读取 STDIN 的脚本中提取的。你能告诉我如何正确地写这一行吗?

这有效

for $*IN.lines() {
    last when "" ;
    say "VERBOSE \"$_ is the string\"";
    $i=$i+1;
}

不起作用

.say "VERBOSE \"$_ is the string\"" for $*IN.lines() last when "";

错误输出:

===SORRY!=== Error while compiling /usr/share/asterisk/agi-bin/agi-t1.p6
Two terms in a row
at /usr/share/asterisk/agi-bin/agi-t1.p6:5
------> .say⏏ "Verbose \"$_\"" for $*IN.lines() last
expecting any of:
  infix
  infix stopper
  statement end
  statement modifier
  statement modifier loop

错误消息的一般解释

===SORRY!=== Error while compiling ...

当你看到一个SORRY!,那么您就知道编译器正在与您讨论编译期间发生的问题,甚至在尝试运行您的代码之前。

Two terms in a row

这是编译器关于阻止其编译代码的原因的英文摘要。我们稍后再回来讨论这个问题。

The ------>是编译器表示它对您所编写的内容感到困惑的方式,并且它将在------>.

The ,一个 Unicode 名称为的字符EJECT SYMBOL,被插入到代码的显示中。它插入的点应该有助于解释错误消息。

在这种情况下,它指向.say and "VERBOSE..."。编译器认为这是连续的两个术语。

什么是术语?

考虑以下代码:

start-time + 42
sum(start-time, 42)

条款有点像数学术语 https://en.wikipedia.org/wiki/Term_%28logic%29。两个示例表达式都包含术语start-time and 42。整体表达start-time + 42也是一个术语。表达方式sum(start-time, 42)可能被称为sum()术语或sum(...) term.

条款也有点像自然语言中的名词或名词短语 https://en.wikipedia.org/wiki/Terminology. start-time and 42就像名词,因此是术语。start-time + 42 and sum(...)就像名词短语一样,每个短语也是一个术语。

(顺便说一句,术语,在与这个问题相关的意义上,是not与解析“终端”(有时称为“术语”)相关。)

现在您可能能够猜测如果您尝试编译本节开头的示例代码会发生什么:

Two terms in a row across lines (missing semicolon or comma?)

第一行(start-time + 42) 是一个术语。sum(start-time, 42)是另一个术语。除了线端之外,它们之间没有任何东西。 Raku 显然不喜欢连续两个术语之间没有非术语的东西,并且空格和行尾不计算在内。

如何避免“连续两项”错误?

运算符喜欢中缀+, 后环绕(), 和中缀,我在上面的示例中使用的可以在运算符位置(术语之前、之后、之间或周围)使用来形成表达式。 (如上所述,整体表达式本身就是术语。)

关键词如for or last,用于关键字位置,也是not术语(除非你疯狂到将它们重新定义为术语,在这种情况下,你可能会得到你应得的奇怪的编译错误。:))但是,像运算符一样,它们必须放置在正确的位置,否则编译器可能会认为它们是条款。如果你写last在错误的地方,编译器可能会认为last是一个术语。

你的代码有问题

编译器认为.say (注意末尾的空格)是一个术语,相当于.say()。所以它把你写的解释为.say() "VERBOSE..."这是连续两个术语。

(我建议您接受事实如此,但如果您希望深入研究方法调用语法的细节以完全理解原因invocant.foo ( arrgh, arrgh, ... ) ;也是“连续两项”,参见我的回答涵盖了与例程调用相关的各种语法 https://stackoverflow.com/a/50283014/1077672.)

让我们通过更改来修复您的代码.say to say(没有.):

say "VERBOSE \"$_ is the string\"" for $*IN.lines() last when "";

编译器返回另一个“连续两项”错误,但现在它指向$*IN.lines() and last.

The for关键字及其迭代参数必须位于语句的开头或结尾。你最后已经使用了它们。

但这意味着之后发生的事情for是一个项(其迭代参数)。

$*IN.lines()可以作为一个术语。

您甚至可以将其作为表达式的一部分,例如。for flat $*IN.lines(), $*FOO.lines()循环输入线和来自其他句柄的线。 (这flat为以下内容创建一个列表for通过展平两个单独的列表来循环,其中一个来自$*IN.lines(),另一个来自$*FOO.lines().)

但你没有建立一个表达式,你只是立即跟随$*IN.lines() with last.

因为没有一个last中缀运算符,以及last必须是语句中的第一个单词才能被解释为关键字last,编译器改为解释last作为一个术语——因此它看到“连续两个术语”。

你需要last是一个语句关键字,并且它需要在上下文中for环形。但你已经在上下文中发表了声明for循环,即say ...表达/术语。您需要一些括号或类似的东西来允许您编写多个语句。这是一种方法:

{ last when ""; say "VERBOSE \"$_ is the string\""; $i=$i+1 } for $*IN.lines();

现在你的代码可以工作了。

最后的调整

我不妨进行一些最后的调整:

( last when ''; say qq[VERBOSE "$_ is the string"]; $i++ ) for lines ;
  • 我已经从{...} to (...)。它并不更紧凑,但它表明当for被写成语句修饰符(即在语句的末尾而不是在开头)。这{...}创建一个词法范围,而(...)才不是;有时,其中之一正是您所需要的。

  • 你不需要$*IN.因为有一个lines子相当于$*IN.lines().

  • 我已经放弃了() after lines因为如果之后没有参数就不需要它们lines (or $*IN.lines) 和语句结束之前。

  • 我用过''代替""因为我认为如果不需要插值引号,使用非插值引号是一个好习惯。

  • 我用过qq[...]因为这意味着你不必逃避"在字符串中。

  • 我用过$i++而不是$i=$i+1因为它达到了同样的效果,而且我认为它读起来更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“连续两项”错误 的相关文章

随机推荐

  • 对于最新的 Unicode 字符,我应该使用哪种字体?

    注意 它们并不新鲜 只是 不支持 不知何故 我正在尝试为我的网站上的元素制作简单的控件 类似于简单的 静音 或 不静音 控件 但是 我还没有找到任何能够处理较新的 Unicode 符号的字体 例如扬声器符号 x1F507 to x1F50A
  • 我的自定义分类 url 链接的页面未显示 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 基本上我有 newsletter php 页面 其中显示所有现有的自定义帖子 从这里 我有一个下拉类别列表 您可以按类别过滤自定义帖子
  • 函数后加分号

    为什么有些人在大括号后面加分号有什么具体原因吗 void foo 不是真的 那里的分号没有区别 这可能是一个习惯问题 如果您愿意 您可以在 C 11 中添加任意多个分号 void foo
  • Windows 10 中的 Django 通道安装失败

    这是环境 操作系统 Windows 10 姜戈 2 0rc Python 3 6 点 10 0 0 视觉工作室社区 2017 以及错误消息 running build ext building twisted test raiser ext
  • Android 打开 pdf 不起作用

    一段时间以来我一直在努力让它发挥作用 我在这里看到了有关如何从 Android 打开 pdf 的其他问题 普遍的共识是我下面的代码 我错过了什么吗 try Uri path Uri parse android resource com Te
  • 是否可以增加 CloudFlare 超时?

    是否可以增加 CloudFlare 超时 如果是 怎么办 我的代码需要一段时间才能执行 而且我不打算在未来几天对其进行 Ajax 化 不 CloudFlare 仅提供这种服务企业计划定制 https www cloudflare com e
  • 在Perl中,如何根据绝对位置的条件来计算成功匹配的出现次数

    仅使用onePerl替换或匹配正则表达式语句 如何修改以下代码 我需要修改的值 pattern在下面的代码中 代码将计算在字符串中找到成功匹配的次数 前提是成功匹配的绝对位置满足特定条件 pattern F1 string F1234F12
  • .(点) 访问静态方法

    下面是一个流行的代码 class A public static const string TYPE AEvent const string getType return TYPE 上面的代码可以这样使用 if aInstance getT
  • 使用 POST 方法将参数发送到 url,而不使用表单

    我想使用 POST 方法将参数发布到 URL 但无法使用表单 即使我确实使用了表单 它也必须在没有用户交互的情况下自动发布 这可能吗 我怎样才能做到这一点 Using jQuery post http docs jquery com Aja
  • 不再支持 UITextField -webView

    使用某些文本字段时 我得到以下调试输出 UITextField webView 被调用 新的文本架构不再支持此方法 有人可以解释为什么会出现这种情况吗 我目前正在 iOS 7 上运行 XCode 5 在 iOS 7 之前的以前的 iOS 版
  • VLC 流至 MP4 WEBM 和 Flash

    我正在尝试将视频从 IP 摄像机流式传输到我的 WordPress 网站 我希望我的流可以通过常见设备 Windows Mac Android 和 IOS 访问 目前我正在使用 VLC 进行流式传输 但我只能使用 flash 流 但我想做
  • 使用 LINQ 搜索关键字

    如果我有一个包含标题的文本字段 并且有一个关键字列表 我如何搜索标题并检查标题中的 n 个关键字 因此 如果我的标题是 烘焙鸡肉 培根和韭菜派 并且用户搜索 鸡肉培根萝卜 我想返回上述食谱 本质上我想说的是 如果标题包含 2 个或更多搜索词
  • Vuetify V-Data-Table 页脚添加按钮

    我想在 v data table 页脚中添加一个与此图像类似的按钮 问题是 如果表包含数据 我通常可以添加一个按钮 但是 如果没有数据 则该按钮不会呈现 这是代码
  • Grails 获取子域对象

    我有两个域类 一个是父域类 另一个是子域类 它们之间有一个 hasMany 关系 父类有很多子类 子类属于父类 这是编码示例 class Parent String name static hasMany childs Child stat
  • 以编程方式更新 MSI 属性

    我需要一个解决方案 希望它应该相当简单 更新 MSI 属性 我们有许多在 TFS 2012 中进行源代码控制的 WiX 项目 并且我们生成其相关的 MSI 以便通过 TeamCity 构建配置进行部署 这些配置通常会构建所需的 wixpro
  • Access SQL 中的逆透视

    大家好 我正在尝试在 MS Access 上的 SQL 中使用 unpivot 我在网上找到了以下代码 SELECT CustomerID Phone FROM SELECT CustomerID Phone1 Phone2 Phone3
  • Jenkins 使用变量 ${GIT_BRANCH} 作为 sonarqube 参数(不带“origin/”)进行构建

    大型团队 每个团队都有单独的 git 分支 并使用声纳作为代码质量检查器 scm 工具设置为选取与该名称对应的每个分支 feature branch 对于 Maven 构建来说 它工作得很好 我想设置 sonarqube 这样它就会为每个实
  • Angularjs $http post 文件和表单数据

    我在 python 中有以下请求 import requests json io cookie payload Name abc url test file out test json fi file file open file r re
  • 如何在 Python 中将十六进制转换为十进制? [复制]

    这个问题在这里已经有答案了 我有一些 Perl 代码 其中 hex 函数将十六进制数据转换为十进制 我怎样才能做到Python http en wikipedia org wiki Python 28programming language
  • “连续两项”错误

    我正在尝试编写如下紧凑的行 代码是从使用动态作用域特殊变量 IN 读取 STDIN 的脚本中提取的 你能告诉我如何正确地写这一行吗 这有效 for IN lines last when say VERBOSE is the string i