Perl 如何解析未加引号的裸词? (裸词、标识符)

2024-01-29

未加引号的单词在 Perl 中似乎有很多含义。

print STDERR $msg;

$hash{key}

func( param => $arg )

my $x = str;

如何确定这些的含义?


下图显示了 Perl 如何按优先级降序解析标识符。

它也适用于由以下链接的标识符::(我将其称为“限定标识符”)除非另有说明。

  1. 当语法预期时,语法定义的含义。

     sub foo { }          # «foo» («sub» is covered later)
     sub main::foo { }    # «main::foo» («sub» is covered later)
     method Class         # «Class» («method» is covered later)
     method Some::Class   # «Some::Class» («method» is covered later)
     $foo
     $main::foo
     //i
     =head
     <<FOO
     Class::
     Some::Class::
     LABEL:
    
  2. 字符串文字,当后面跟着一个=>或者当整个哈希索引表达式时。

    这不适用于合格的标识符。

     my %h = ( a => 1 );
     $h{a}
    
  3. 整个取消引用表达式时的变量名称。

     ${foo}
     ${main::foo}
    

    请注意,使用关键字的名称、命名运算符或声明的 sub 将导致ambiguous use警告。

  4. Keyword.

     while (1) { }
     sub { }
     use
     __END__
    
  5. 当先前导入的子名称时,子调用。

     use Time::HiRes qw( time );
     time
     main::time
    
  6. 调用命名列表运算符、命名一元运算符或命名空运算符。

     print $x, $y, $z;
     $c = chr $i;
     $t = time;
     $t = CORE::time;
    
  7. 标签,当用作操作数时next, last, redo or goto.

    被视为标签的限定标识符会导致编译错误,因为标签不能是限定标识符。

     next LABEL;
    
  8. 当先前声明的子或常量的名称时,子调用或内联常量。

     sub foo { }
     foo                          # Calls sub «foo»
     main::foo                    # Calls sub «foo»
    
     sub bar;
     bar                          # Calls sub «bar»
    
     use constant FOO => 123;
     FOO                          # Replaced with the value of the constant.
    
  9. 间接方法调用,当后跟可能限定的标识符时,可能限定的标识符后缀为::、标量(包括数组元素或散列元素)或块。

     method Class           # Calls method «method» («Class» is covered earlier)
     method Some::Class     # Calls method «method» («Some::Class» is covered earlier)
     method Class::         # Calls method «method» («Class» is covered earlier)
     method Some::Class::   # Calls method «method» («Some::Class» is covered earlier)
     method $o              # Calls method «method»
     method { $o }          # Calls method «method»
    
     Base::method Class     # Calls method «Base::method» («Class» is covered earlier)
    

    您可以使用no indirect https://metacpan.org/pod/indirect当以这种方式解析代码时发出警告的杂注。

  10. Glob,当用作需要文件句柄的运算符的操作数时。

     open(FH, '>', $qfn) or die $!;      # Equivalent to open(*FH, ...) or ...;
     print FH "Hello, World!\n";         # Equivalent to print *FH ...;
     print main::FH "Hello, World!\n";   # Equivalent to print *main::FH ...;
    
  11. 字符串文字,在以下情况下:

    • 当用作直接方法调用的调用者时。

        Class->method(@args)         # Uses the string «Class» as the invocant.
        Some::Class->method(@args)   # Uses the string «Some::Class» as the invocant.
      
    • 用作一元减号的操作数时。

        -foo
        -foo::bar
      
    • 当用作原型为的子参数的参数时*.

        sub myprint(*@);
        myprint(FH, "Hello, World\n");
        myprint(main::FH, "Hello, World\n");
      
  12. 字符串字面量。这是不允许的use strict qw( subs );.

希望我没有错过任何一个。

感谢@mosvy、@Grinnz 和@stevesliva!每个人都揭露了一些我错过的案件。


目前失踪:

  • funcname in sort funcname.

  • BEGIN和类似的。它们有时充当关键字,有时充当声明的子项。

  • 导入子名称print不遵循上述步骤。

    $ perl -M5.010 -e'
       use subs qw( time );
       eval { time; };
       say $@ =~ /Undefined sub/ ? "ok" : "bad";
    '
    ok
    
    $ perl -M5.010 -e'
       use subs qw( system );
       eval { system; };
       say $@ =~ /Undefined sub/ ? "ok" : "bad";
    '
    ok
    
    $ perl -M5.010 -e'
       use subs qw( print );
       eval { print; };
       say $@ =~ /Undefined sub/ ? "ok" : "bad";
    '
    bad
    

    我不知道这个有什么特别之处,也不知道是否还有其他的。我猜是因为print没有原型,但是system也没有原型。

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

Perl 如何解析未加引号的裸词? (裸词、标识符) 的相关文章

  • 用于(联合国)结构化文本文档的词法分析器/解析器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有很多脚本解析器和词法分析器 即结构化计算机语言 但我正在寻找一个可以将 几乎 非结构化文本文档分成更
  • 如何将会话管理添加到简单的 Perl CGI 网页?

    我有一个简单的网页 到目前为止不需要任何登录 它是用 Perl CGI 编程的 我想知道添加会话支持以便获得登录信息的步骤 我不需要非常复杂的方法 因为网页非常简单 另外 我想要一些关于支持 Perl 会话所需的技术 库的建议 我在很多很多
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • 无法从日志文件中提取特定信息

    我这里有日志文件我想提取以下信息 想要提取十六进制值 如果该行有第二个括号 0 9 想要提取十进制值 首先转换为十六进制 然后提取 9 gt 0x09 想要提取负值 25 先转换为十六进制然后提取 例如 25 gt FFE7 gt 想要提取
  • 在 JAVA 中使用 SAX 解析器从 XML 文件中提取文本节点

    因此 我目前正在使用 SAX 尝试从我正在处理的大量 xml 文档中提取一些信息 到目前为止 提取属性值确实很容易 但是 我不知道如何从文本节点中提取实际值 例如 在给定的 XML 文档中
  • 客户端浏览器关闭时服务器端 Perl CGI 脚本中断

    我已经尝试解决一个小问题很长一段时间了 但似乎我无法解决 我编写了一个 HTML 页面 它在提交表单时调用 perl CGI 脚本 该 CGI 在服务器端执行一定数量的任务 我让脚本将这些任务的步骤打印到 HTML 页面上的 iframe
  • Perl 和 Selenium::远程::驱动程序

    再次编辑 我在弗吉尼亚州北部某处的 AWS 上有一台服务器 这是我的监控服务器 我从另一个状态 ssh 进入这个 Ubuntu 服务器来进行系统管理 我想在这台服务器上进行 Web 自动化测试 它将测试互联网上的 Web 应用程序 点击 U
  • C# 是否有像 Java 那样的字符串分词器?

    我正在做简单的字符串输入解析 我需要一个字符串标记器 我是 C 新手 但已经编写过 Java 程序 因此 C 应该有一个字符串标记生成器似乎很自然 可以 它在哪里 我该如何使用它 你可以使用String Split 方法 http msdn
  • Perl:正则表达式不抓取代码中的多行 C 风格注释

    我有一个 Perl 程序 读取用 C 编写的 SRC 文件 使用 SRC 文件中的正则表达式匹配来查找特定格式的数据以用作目标文件名 打开新的目标文件 执行另一个正则表达式匹配以查找包含关键字 abcd 的所有 C 风格注释 注意 这些注释
  • 如何将 NTLM 身份验证与 Perl 的 SOAP::Lite 模块集成?

    此 Perl 代码适用于对 ASP NET Web 服务的匿名访问 但当打开集成安全性时 该服务会返回 401 错误 我认为我需要将 NTLM 模块与 SOAP Lite 结合使用 但尚不清楚如何做到这一点 如何集成这些组件 use SOA
  • _实际_ Twitter 主题标签格式?不是你的正则表达式,也不是他的代码——真正的代码?

    更新 如果可以的话 请使用 Twitter 的实体 他们为您以及其他项目找到了解决方案 我的情况是 我只有没有实体的推文和所有额外的元数据 我花了我认为不合理的时间试图找到actual主题标签的格式 据我搜索得知 Twitter 尚未发布任
  • 如何在 Perl 脚本中加密或隐藏密码?

    我正在研究 Perl 脚本 它使用Expect http search cpan org dist Expect通过 telnet 登录到远程计算机 不要问 必须使用 telnet 我还根据需要执行 perforce p4 登录操作 并使用
  • 从具有多行记录的文件中提取数据,将每个范围保存到单独的文件中

    我有一个看起来像这样的文件 TRANSACTION STARTED 020t CARD INSERTED 020tCARD 5845 DATE 01 02 16 TIME 05 45 52 05 46 26 GENAC 1 ARQC EXT
  • 使用 python 将 bibtex 文件转换为 html (也许是 pybtex?)

    您好 我想解析 bibtex 出版物文件并对特定字段 例如年份 进行排序并过滤某些内容 然后将其放在网站上 我遇到了 pybtex 它可以读取和解析 bibtex 文件 但它基本上没有记录 我不知道如何对条目进行排序 pybtex 是可行的
  • 如何在 Perl 字符串中手动插入字符串转义符?

    在perl中假设我有一个像这样的字符串 hello tworld n 而我想要的是 hello world 也就是说 hello 然后是文字制表符 然后是 world 然后是文字换行符 或者等价地 hello tworld n 注意双引号
  • 在 Julia 中保存和检索字典的正确方法是什么?

    我已经看到 Julia 充分解释了 MAT 文件 这些文件中的结构可以毫无问题地作为字典读取 现在我创建了自己的字典 其结构如下 String String gt Int Int Int 在每个条目上 我可以保存它writedlm它产生了一
  • 解析时间字符串,如“1h 30min”

    任何人都知道 Java 库可以将 30min 或 2h 15min 或 2d 15h 30min 等时间字符串解析为毫秒 或某种 Duration 对象 Joda Time 可以做这样的事情吗 我有一个丑陋的长方法来维护它进行此类解析 并且
  • 将字符串解析为结构变量

    我试图将字符串解析为其中包含不同变量的结构向量 这是我到目前为止所拥有的 但似乎不起作用 struct client string PhoneNumber string FirstName string LastName string Ag
  • Python将文本文件解析为嵌套字典

    考虑以下数据结构 HEADER1 key value key value HEADER2 key value key value HEADER3 key value HEADER4 key value key value 原始数据中没有缩进

随机推荐

  • 在c#中使用oledb获取Excel数据范围

    我想通过使用 oledb 获取 Excel 工作表使用的数据范围 代码如下 String strExcelConn Provider Microsoft Jet OLEDB 4 0 Data Source E DOTNET CrsMicro
  • 外部车把模板骨干木偶

    在我的应用程序中 我添加了 Marionette sync 插件并覆盖这些方法 Backbone Marionette TemplateCache prototype loadTemplate function templateId cal
  • 具有重复组的正则表达式

    我一直在尝试匹配连字符之间的短语 我意识到我可以轻松地拆分连字符并取出短语 但我的等效正则表达式无法按预期工作 我想了解原因 只是我对短语的定义 只是非捕获空格分隔的连字符 so 正在捕获连字符或行尾 最后 整个内容用括号括起来 量词匹配多
  • AngularJs + ServiceStack 应用程序的安全性

    我有一个前端有四个模块的应用程序 我试图在前端尽可能多地使用 AngularJs 我正在使用一个空的网站 asp net 项目来托管所有文件和 REST serviceStack 我的项目具有以下结构 web config global a
  • ReactJS中子父组件通信

    我喜欢在事件触发时将属性 property props state 值从子组件发送到父组件onDrag 我找不到这方面的正确文档 这是我的代码 jsx React DOM var APP React createClass getIniti
  • jQuery:将 TextArea 内容转换为 html 字符串,反之亦然

    我想做的是将 TextArea 内容转换为有效的 html 代码 假设您在 TextArea 内键入内容 然后按下一个按钮 该按钮会在元素内显示键入的文本 如果您在 TextArea 中输入类似内容 嗨伙计 你喜欢 jQuery 吗 I d
  • Sphinx 过滤器 - 过滤器属性之间可以有“OR”吗?

    我正在使用 sphinx 列出数据库中的一些项目 几乎100 我只是还没弄清楚如何创建一个OR两个不同的过滤器之间 例如 我在数据库中的对象有开始日期和结束日期 我可以filter starting date x y and filter
  • jquery-file-upload 插件:如何更改上传路径?

    我正在尝试使用 blueimp jquery file upload 插件 似乎是一个很好的上传器 但文档没有帮助 当我使用可下载的演示脚本时 一切正常 但是 当我想更改上传路径时 这不起作用 我尝试在index php中更改操作路径 如下
  • Iterable> 无法确认函数中的泛型 T

    这是我的问题 const iterable 1 2 3 function flat
  • ASP.NET Core 使用多种身份验证方法

    同时使用 Cookie 身份验证中间件和 JWT 身份验证中间件 当我登录用户时 我创建自定义声明并将其附加到基于 cookie 的身份 我还从外部源获取一个 jwt 令牌 它有自己的声明 我使用此令牌来访问外部资源 启用身份验证时 我的控
  • 选择列表的字典键和值

    Dictionary
  • RecyclerView 平滑滚动到中心位置。安卓

    我正在使用水平布局管理器RecyclerView 我需要做RecyclerView接下来的方式 当单击某个项目时 平滑滚动到该位置并将该项目放在中心RecyclerView 如果可能的话 例如 从 20 项中选择 10 项 所以 我没有问题
  • 在 postgres 中创建超级用户

    我正在寻找使用 Vagrant 设置 Rails 环境 为此 它是通过 bash shell 方法配置的 其中包括以下行 sudo u postgres createuser
  • Django:从数据库获取一个对象,如果没有匹配的则为“无”

    是否有任何 Django 函数可以让我从数据库中获取对象 或者如果没有匹配则没有 现在我正在使用类似的东西 foo Foo objects filter bar baz foo len foo gt 0 and foo get or Non
  • Laravel 5.5 Collection 哪里喜欢

    我正在使用集合过滤数据 但我需要使用类似的方法 我曾尝试这样写 name LIKE value 但它不起作用 这是我的方法 protected function filterData Collection collection transf
  • 消除“switch”语句[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 消除使用的方法有哪些switch代码中的语句 Switch 语句本身并不是反模式 但如果您正在编写面向对象的代码 则应该考虑是否可以更
  • 在将连续查询添加到生产 influxdb 之前测试连续查询的最佳方法是什么?

    将新的连续查询添加到生产数据库 influxdb 的最佳方法是什么 克隆生产 influxdb 吗 我希望避免这种情况 有没有一种好的方法可以通过网络管理界面来测试和尝试它们 我想你可以 创建临时测量 设置 CQ 插入一些示例数据并在 CQ
  • 删除 Windows Phone 芒果中的后备条目

    我如何删除 wp7 1 中的后退堆栈 我有 3 个页面 当我从 A 导航到 B 时 说 A B C 在 B 中有一个按钮可以添加新的联系方式 当我单击它时 页面导航到页面C 和在页面 C 中有一个 完成 按钮 当我单击 完成 按钮时 页面导
  • 使用 Ecto 的原始 SQL

    我对 Elixir 和 Phoenix Framework 的世界还很陌生 我正在尝试遵循 TheFireHoseProject 教程 但在使用 Ecto 查询原始 SQL 时遇到问题 该教程说这应该有效 defmodule Queries
  • Perl 如何解析未加引号的裸词? (裸词、标识符)

    未加引号的单词在 Perl 中似乎有很多含义 print STDERR msg hash key func param gt arg my x str 如何确定这些的含义 下图显示了 Perl 如何按优先级降序解析标识符 它也适用于由以下链