为什么在这个 Perl 示例中,defineed sdf 返回 true?

2023-12-28

我在 Perl 中尝试了这个例子。有人可以解释为什么这是真的吗?

  if (defined sdf)  {   print "true";  }

它打印true.

sdf 可以是任何名称。

另外,如果定义了 sdf 函数并且返回 0,则不会打印任何内容。

print (sdf);不打印 sdf 字符串,但

if (sdf eq "sdf")
{
 print "true";
}

打印正确。

如果 sdf 是字符串,相关问题仍然存在。什么不是打印出来的?


sdf is a bareword http://www.perlfoundation.org/perl5/index.cgi?bareword.

perl -Mstrict -e "print qq{defined\n} if defined sdf"


Bareword "sdf" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.
  

想要更多乐趣,请尝试

perl -Mstrict -e "print sdf => qq{\n}"

See 严格来说 use strict http://www.stonehenge.com/merlyn/UnixReview/col54.html:

use strict 的 subs 方面禁止将“裸词”解释为文本字符串。默认情况下,不是内置关键字或以前看到的子例程定义的 Perl 标识符(字母、数字和下划线的序列,除非完全是数字,否则不以数字开头)被视为带引号的文本字符串:

@daynames = (sun, mon, tue, wed, thu, fri, sat);

然而,这被认为是一种危险的做法,因为可能会导致以下错误:

@monthnames = (jan, feb, mar, apr, may, jun,
               jul, aug, sep, oct, nov, dec);

你能发现这个错误吗?是的,第 10 个条目不是字符串“oct”,而是对内置函数的调用oct()函数,返回默认值的等价数字$_被视为八进制数。

更正:(感谢@ysth)



E:\Home> perl -we "print sdf"
Unquoted string "sdf" may clash with future reserved word at -e line 1.
Name "main::sdf" used only once: possible typo at -e line 1.
print() on unopened filehandle sdf at -e line 1.
  

如果提供裸字print在间接对象槽中,它被视为要打印的文件句柄。由于没有提供其他参数,print默认打印$_到文件句柄sdf. Since sdf没有打开,失败。如果您在没有警告的情况下运行此命令,则不会看到任何输出。另请注意:



E:\Home> perl -MO=Deparse -e "print sdf"
print sdf $_;
  

作为这一观察的确认。另请注意:



E:\Home> perl -e "print asdfg, sadjkfsh"
No comma allowed after filehandle at -e line 1.
  


E:\Home> perl -e "print asdfg => sadjkfsh"
asdfgsadjkfsh
  

后者打印两个字符串,因为=>如果字符串仅由“单词”字符组成,则会自动在 LHS 上引用字符串,从而删除第一个参数的文件句柄解释。

所有这些例子都表明,使用裸词会带来很多惊喜。你应该use strict以避免此类情况的发生。

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

为什么在这个 Perl 示例中,defineed sdf 返回 true? 的相关文章

随机推荐

  • 使用 C# 将布尔数组转换为字符串

    我有一个看起来像这样的数组 status 0 true status 1 true status 2 false status 3 true 实际上它更大 但仍然小于 20 我需要将其转换为 ABD 其中每个 true 代表字母表中的一个有
  • 使用芯片输入选择不显示所选值

    我有一个选择 输入采用芯片格式 我尝试了所选值的控制台日志 效果很好 但由于某种原因 它没有显示在选择框中 我在这里做错了什么 handleChange event gt this setState badge event target v
  • Spring Boot中事务同步与Database+kafka示例

    我想使用 Spring boot 编写一个新应用程序 使用 MySQL Mango 数据库和 Spring Kafka 进行消息传递 我尝试使用 Many POC 来同步 Kafka 和 DB 之间的事务 但在某些情况下失败了 并且我还搜索
  • 如何访问 CGContext 以在屏幕外创建 CGLayer

    意图 创造CGLayer在屏幕外 从第二个线程在其上绘制一些复杂的东西 稍后使用它在主线程上快速绘制 Problem CGLayerCreateWithContext context size info 期望已经存在的CGContext这样
  • 如何在 ASP.net IIS 7.5 中利用浏览器缓存

    以下可缓存资源的新鲜生命周期较短 指定以下资源至少在未来一周内到期 http pagespeed googlelabs com http pagespeed googlelabs com建议我将此作为我的网站的高度优先事项 我正在使用 Wi
  • 用于 GUI 的 Java 2D 场景图形库

    我正在寻找用于构建 GUI 应用程序的 2D 场景图形库 它应该很快 使用 Java2D 并与 Swing 兼容 可嵌入 Swing 应用程序并显示 Swing 组件 对动画的支持是一个优点 您有使用某些图书馆的经验吗 有没有我错过的图书馆
  • Numpy 图像数组:如何有效地从 RGB 切换到 Hex

    我一直在使用嵌套 for 循环将 RGB 图像转换为十六进制值的图像数组 但对于大图像来说太慢了 有谁知道可以帮助我从 RGB 切换回 HEX 的快速方法和 或库 编辑 ragingSloth 这是我想出的 但对于我的需要来说太慢了 def
  • 如何在 Travis CI 上安装某些东西而不超时?

    我正在尝试测试 travis ci org 上构建的包 但 pip install scipy 遇到超时 Installing collected packages scipy Running setup py install for sc
  • 如何从 Excel 单元格获取完整值,而不是显示的(四舍五入)值?

    我在从工作表的单元格检索确切值时遇到问题 如果我打开文件 单元格有一个十进制数 仅显示 4 位小数 但如果我单击特定单元格 则该值会不同 有 6 位小数 我知道这是应用于单元格的设置 以便仅显示 4 位小数 现在我尝试使用 ClosedXM
  • WPF中如何移动焦点?

    我想知道是否有办法将焦点从当前控件移至 WPF 中 TabIndex 分配的控件上的其他控件 例子 我有 TabIndex 1 到 5 的控件 有没有办法将焦点从 1 跳转到 5
  • 从 C# 类设置 Gridview“标题”的样式

    我正在尝试在 C 文件中设置 ASP Net GridView 标题的样式 这是我返回样式化 GridView 的方法 private GridView setupGridView string caption var gview new
  • 检查context.Request.Body的条件是azure api管理策略中的JArray或JObject

    我正在使用 Azure API 管理策略表达式将供应商值发送到每个帖子 对后端 API 的放置和删除请求 我编写了一个代码 当请求类型为 JObject 时 该代码工作正常 但我有一些请求可以是 JArray 类型的情况 在这种情况下它会抛
  • 如何在IIS7中禁用应用程序池空闲超时?

    如果我将空闲超时设置为0 它会被禁用吗 是的 将空闲超时值设置为零将禁用空闲超时 奇怪的是 这没有记录在 MS 文档中 但我的证据来自 IIS 设置架构 如果您查看了 IIS 设置架构 C Windows System32 inetsrv
  • 如何安装:OpenSSL + WAMP

    这里有人有关于如何在我的本地开发计算机上获取 SSL 的清晰详细的步骤吗 我已在 c wamp 上安装了最新版本的 WAMP 2 2c 我在网上找到的说明在大多数情况下似乎已经过时 并且缺乏正确完成工作所需的详细信息 指南 WampServ
  • wl-pprint-extras 中的可选空格和多个替代项

    是否有一种好的 可接受的方法来获得两种以上的替代布局 特别是支持可选空间的方式 特别是 我可能想通过以下三种方式之一打印列表 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 按照该优先顺序 您可以先尝试一种替代方案 然后再尝试另
  • 从 FireWire 获取视频流

    我正在尝试通过 FireWire 将摄像机 Sony HVR Z1E 中的视频流式传输到我的计算机 传入的图片 流应由一些期望 CVMat 格式 来自 openCV 的函数进一步处理 好吧 我现在的问题是我不知道如何获取流 好吧 openC
  • Istio 分布式跟踪与 Jaeger 不起作用

    我正在尝试设置本地 k8s 集群minikube已安装istio我在使用 Jaeger 启用分布式跟踪时遇到问题 我有3个微服务A gt B gt C 我正在传播所需的所有标头 x request id x b3 traceid x b3
  • escapeshellarg 和 escapeshellcmd 有什么区别?

    PHP 有 2 个密切相关的函数 escapeshellarg http php net escapeshellarg and escapeshellcmd http php net escapeshellcmd 它们似乎都做类似的事情 即
  • super() 并更改协作方法的签名

    在多重继承设置中 例如所列出的 我该如何使用super 并处理层次结构中的类之间函数签名发生变化的情况 即我可以重写这个例子 在 python3 中 来使用super 例子取自文章super 被视为有害文章 https fuhm net s
  • 为什么在这个 Perl 示例中,defineed sdf 返回 true?

    我在 Perl 中尝试了这个例子 有人可以解释为什么这是真的吗 if defined sdf print true 它打印true sdf 可以是任何名称 另外 如果定义了 sdf 函数并且返回 0 则不会打印任何内容 print sdf