未指定使用5.30.0时,Perl的HelloWorld示例给出两个错误

时间:2019-05-31 17:42:16

标签: perl version

NEWBIE:所以今天我开始学习Perl的教程,并且一切正常,直到我 使用#。###;

有人可以解释一下省略该版本时Perl的默认值吗?

当我将的值使用5.30.0; 时,示例将运行。但是,如果我根本不指定该行,则根据main的位置和对sayit()的调用,会出现以下两个错误。

第一个错误,如果软件包为main;在文件顶部打个招呼:: sayit()...。

  

无法通过helloWorld.pl第7行的程序包“ hello :: sayit”(也许您忘记加载“ hello :: sayit”?)定位对象方法“ say”。

icon_definitions

第二个错误,如果软件包为main;在文件底部打个招呼:: sayit()...。

  

在“ say hello :: sayit”附近的helloWorld.pl第20行中找到了运算符所期望的裸字

from kivy.lang import Builder
from kivy.base import runTouchApp

runTouchApp(Builder.load_string("""
#:import md_icons kivymd.icon_definitions.md_icons
#:import rgba kivy.utils.get_color_from_hex

<TopBar@GridLayout>:
    rows: 1
    padding: dp(4)
    size_hint_y: None
    height: dp(48)
    spacing: dp(10)

    canvas.before:
        Color:
            rgba: rgba("#3F51B5")
        Rectangle:
            pos: self.pos
            size: self.size

    Button:
        size_hint_x: None
        width: self.height
        text: u"{}".format(md_icons['home'])
        font_name: 'data/materialdesignicons-webfont.ttf'
        background_normal: ''
        background_color: rgba("#3F51B5")

    Label:
        text: "Home"
        size_hint_x: None
        width: self.texture_size[0]
        font_size: dp(16)
        font_name: "data/Roboto-Medium.ttf"


GridLayout:
    cols: 1
    canvas.before:
        Color:
            rgba: rgba("#fafafc")
        Rectangle:
            size: self.size
    TopBar:

"""))

1 个答案:

答案 0 :(得分:6)

  

有人可以解释一下省略版本时Perl的默认值吗?

use VERSION;具有三个用途:

  • 它执行Perl版本的编译时检查。
  • [仅当VERSION为5.10+时 启用功能,就好像已指定use feature ":VERSION";
  • [仅当VERSION为5.12+时 启用约束,就像指定了use strict;一样。

默认值为不执行任何版本检查,并且不启用任何featuresstrictures


在这里,我解释了为什么您发布的摘要导致错误。

say添加到Perl时,向后兼容性阻止了它在默认情况下全局可用。它将有损坏的脚本和模块,这些脚本和模块具有名为say的子。因此,在使用say之前,必须采取措施。

可以使用say使

use feature qw( say );可用。

还可以使用say(及更高版本)使

use 5.10.0;可用,因为这将为您启用say功能(除其他外)。这就是use 5.30.0;为您服务的原因。

或者,无需启用此功能即可使用CORE::say代替say。 (这需要5.12 +。)

$ perl -e'say "foo"'
String found where operator expected at -e line 1, near "say "foo""
        (Do you need to predeclare say?)
syntax error at -e line 1, near "say "foo""
Execution of -e aborted due to compilation errors.

$ perl -e'use feature qw( say ); say "foo"'
foo

$ perl -e'use 5.10.0; say "foo"'
foo

$ perl -e'CORE::say "foo"'
foo

这是documented