Perl 中 -> 和 :: 有什么区别

2024-01-04

两者之间的确切区别是什么:: and ->在 Perl 中?

->有时在哪里工作::才不是。


::有两个用途。

  1. 它是包名称中的命名空间分隔符

     use Foo::Bar;    # Load Foo/Bar.pm
     $Foo::Bar::var   # $var in namespace Foo::Bar
    
  2. Appended to a bareword, it creates a string literal[1].

    下面的内容是一样的'hello'除非它警告包裹hello不存在:

     hello::
    

->有两个用途。

  1. 它用于取消引用。

     $array_ref->[$i]
     $hash_ref->{$k}
     $code_ref->(@args)
    
  2. 它在方法调用中用于表示调用者。

     CGI->new()        # Static method call
     $cgi->param()     # Object method call
    

您可能会问两者之间有什么区别

Foo::Bar::mysub()

and

Foo::Bar->mysub()

前者是函数调用。后者是方法调用。方法调用类似于函数调用,但有两点不同:

  1. 方法调用使用继承。

  2. 方法调用传递调用者(调用者剩下的部分)->) 到 sub 作为它的第一个参数。

{
   package Foo::Baz;
   sub new {
      my ($class, $arg) = @_;
      my $self = bless({}, $class);
      $self->{arg} = $arg;
      return $self;
   }

   sub mysub1 {
      my ($self) = @_;
      print($self->{arg}, "\n");
   }
}

{
   package Foo::Bar;
   our @ISA = 'Foo::Baz'; 
   sub mysub2 {
      my ($self) = @_;
      print(uc($self->{arg}), "\n");
   }
}

my $o = Foo::Bar->new('hi');  # Same as: my $o = Foo::Baz::new('Foo::Bar', 'hi');
$o->mysub1();                 # Same as: Foo::Baz::mysub1($o);
$o->mysub2();                 # Same as: Foo::Bar::mysub2($o);

Notes

  1. Foo->method欺骗性地呼叫子名称Foo如果存在(使用它返回的值作为调用者)。Foo::->method, 意义'Foo'->method,没有。更多关于此here https://stackoverflow.com/q/77046381/589924.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl 中 -> 和 :: 有什么区别 的相关文章

随机推荐

  • 使用 AND 和 OR 运算符的 Solr 字段查询 (fq)

    我一直在努力使用 AND 和 OR 运算符形成 solr 字段查询 为什么 solr 对于 1 和 2 3 和 4 查询返回不同的结果 即使所有查询都有相同的逻辑 fq 名称 abc AND 城市 1 3 OR 名称 abc AND loc
  • 无法访问developer.apple.com 中的证书、标识符和配置文件

    我正在尝试遵循以下内容有效的配置文件均不包含设备 https stackoverflow com questions 28585821 none of the valid provisioning profiles include the
  • tkinter GUI 写入文本小部件并替换文本

    from tkinter import from tkinter import ttk parent Tk p ttk Panedwindow parent orient HORIZONTAL p pack fill BOTH expand
  • 无法访问已处置的对象。对象名称:FileBufferingReadStream

    我正在尝试在天蓝色中上传文件 所以基本上我正在尝试将文件转换为流 以便我可以在服务器上创建一个文件并写入其数据 public async Task UploadFileOnAzure string path string name IFor
  • 从外部文件调用 jQuery 日期选择器

    我对 jQuery 比较陌生 并且很难让 jQuery 日期选择器从外部 js 文件工作 最初 我将脚本创建为函数 但认为这样做会限制范围 并且无法在函数外部访问它 我还尝试将其定义为函数 并命名该函数 然后使用 document read
  • 允许用户在 iOS 应用程序内切换应用程序跟踪同意状态

    如何使用户能够从菜单中轻松切换同意inside具有新的应用程序跟踪透明度要求的实时 iOS 应用程序 我曾经通过复选标记按钮来跟踪用户同意情况 而无需 Apple 的 ATT 要求 我还可以使用此同意状态吗 我可以通过网络视图跟踪同意吗 T
  • 时差节目

    我正在使用以下函数来计算时差 它没有显示正确的输出 1 个月的时差后显示 2 分钟的差异 我的程序出了什么问题 public String TimestampDiff Timestamp t long t1 t getTime String
  • 打开新窗口时,Visual Studio 中的 Silverlight 调试停止工作

    我有一个托管 silverlight 应用程序的 aspx 页面 调试工作正常 当我直接转到页面时 silverlight 应用程序中的断点会被命中 但是当我从其托管 ASP NET 应用程序在新窗口中启动页面时 断点将停止被命中 有任何想
  • Zend_db 更新更好的错误报告

    当我更新记录时 我使用 更新 的结果来确定它是否正常工作 a this gt db gt insert self TABLE saveData a 1 表示更新了一条记录 a 0 表示它没有更新任何内容 如果表格没有任何改变 我可以得到 0
  • C 和 C++ 中的声明/定义作为语句

    当这不能在 C 中编译时我很困惑 int main for int i 0 i lt 4 i int a 5 A dependent statement may not be declaration return 0 我习惯了 C 来编译它
  • 为什么我使用 UpdateSourceTrigger=PropertyChanged ,TwoWay 还不够?

    你好 有源和目标文本框 txttarget 与 txtsource 绑定 当在 txtsource 中写入内容时 txttarget 发生了变化 一切都很好 但是在 txttarget 上写入时 我没有看到 txttarget 有任何变化
  • 四开不渲染

    我的四开文档突然停止渲染 我已重新安装 RStudio 和 quarto 软件包 但此问题仍然存在 当我打开新的四开文档时 我不再在新文档中看到样板材料 该文档是空的 就像我选择了一样Create Empty Document 但我没有 然
  • Spyder默认模块导入列表

    我正在尝试设置一个稍微定制的 Spyder 版本 当 Spyder 启动时 它会自动导入一长串模块 包括来自 matplotlib numpy scipy 等的模块 有没有办法将我自己的模块添加到该列表中 为了以防万一 我使用 Python
  • Linux:杀死后台任务

    如何终止 Linux 中最后生成的后台任务 Example doSomething doAnotherThing doB doC doD kill doB 你可以通过工作号码杀人 当您将任务置于后台时 您会看到类似以下内容的内容 scrip
  • 有多少内存使用字节枚举,这是否优化了 C# 中的内存/速度?

    在 C 中使用字节枚举进行小型枚举是一种好处还是一种好的做法 这会减少内存使用吗 这能提高速度吗 Example enum Fruits byte Apple Orange Banana 相比之下有什么优势 enum Fruits Appl
  • iPad Pro 图标和启动图像

    我正在开发一个基于 adobe air 的 iOS 应用程序 我需要知道最近为 iPad Pro 添加的资源的名称 启动图像 2048 x 2732 和图标 167x167 不幸的是 根据以前的名字很难猜出他们的名字 我找到 电子邮件受保护
  • IdentityServer4使用ApiKey或Basic身份验证直接到API

    我正在使用 IdentityServer4 让我的客户通过 JavaScript 登录并访问网页和 api 并且运行良好 然而 有一个新的要求 而不是使用用户名和密码从身份服务器获取访问令牌 然后使用它通过承载身份验证访问 api 我需要使
  • Knockout js jquery范围滑块&& 2个输入

    我需要一些帮助 我有一个代码http jsfiddle net ZNvWR 19 http jsfiddle net ZNvWR 19 我是淘汰赛新手 找不到任何解决方案 那么 如何重写此代码以获取工作输入 更改输入中的值会更改滑块值 di
  • 有没有办法使用动态修订来指定 Ivy 依赖项但限制状态?

    我是否可以使用动态修订来声明依赖项 同时限制检索到的工件的状态 例如 我想定义一个版本范围 例如 1 0 1 1 但我不想要具有集成状态的工件 只需要里程碑或发布 因此 如果版本 1 0 5 的状态为 发布 即使版本 1 0 6 的状态为
  • Perl 中 -> 和 :: 有什么区别

    两者之间的确切区别是什么 and gt 在 Perl 中 gt 有时在哪里工作 才不是 有两个用途 它是包名称中的命名空间分隔符 use Foo Bar Load Foo Bar pm Foo Bar var var in namespac