问题标签 [subroutine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
395 浏览

perl - Perl:cmpthese 文本与传递参数的匿名子问题

如果您cmpthesePerl Benchmark模块的文档中阅读过,它会声明cmpthesetimethese可以与文本或子例程引用中的代码一起使用。文档似乎暗示这些形式是完全可以互换的:

我在使用字符串形式传递参数与使用cmpthese. 中的值@array没有通过,或者我有一个运行时错误。

我有以下代码:

我使用的所有表格都可以正常使用,eval所以我认为这可能是 Benchmark 的问题?我已经使用我所有的 google foo 来尝试找到两种形式之间的一些记录差异,但我不能。

有谁知道我上面的简单示例似乎没有按预期工作的原因?代码中的注释表明了我在 OS X、Perl 5.10.0 上遇到的问题。

0 投票
2 回答
350 浏览

perl - “将参数传递给子程序”-问题?

例程2也可以吗?或者我不应该这样做吗?(我不需要子例程中的@list 副本)

0 投票
3 回答
134 浏览

perl - 为什么子例程参数的使用比外部变量慢?

运行以下代码:

我得到以下基准测试结果:

为什么 NODEFAULT 版本比 DEFAULT 慢很多?

0 投票
1 回答
191 浏览

perl - 无法识别对本地 perl 模块的修改

我在自己的文件中有一个 perl 子例程。它由两个不同的 perl 脚本分别调用。我修改了传入的参数列表,并对两个调用脚本进行了必要的更改,但只有一个脚本符合我的预期。当我在另一个上使用 perl 调试器时,当调试器进入模块中的子例程时,它会显示模块在我编辑之前的样子。因此,当我运行该脚本时,它传入了新的参数列表,但模块试图以旧方式分配它们,这显然是错误的。

什么可能导致这种情况?为什么一个脚本可以正常工作而另一个不能?

具体来说,是的,我正在使用严格和警告。老的:

并在模块中:

我添加了对参数的数组引用。调用脚本的新功能是:

新模块:

当我用调试器运行我的脚本并进入这个模块时,它显示我的 $string 是从 $_[0] 分配的,作为子例程的第一行,就好像我从未更改过模块一样。

同样,这只发生在我的一个脚本中,但另一个运行良好。一切都在同一个目录中。我在linux上运行它,perl 5.10。我很困惑!

0 投票
3 回答
594 浏览

types - 帮助!传递 FORTRAN 整数会将它们转换为不准确的浮点数?

当我创建一个标量整数 s 并将其传递给子例程时,它的值被转换为浮点数并且非常不准确。例如,如果我设置 s = 2 和 CALL print_my_int(s),它将把它写入()到控制台,它的值显示为 2.80259693E-45。其他标量整数的行为类似,除了 s = 0 的情况,在这种情况下,输出为 0.0000000。但即使这样仍然是错误的,因为整数显然不应该显示小数和尾数。这不是输出格式问题,因为我可以让其他整数在本地显示时正确显示。

关于这里发生了什么的任何线索?我是否需要在子例程定义中强制参数数据类型?这甚至可以做到吗?

示例代码:

结果输出:

0 投票
2 回答
2502 浏览

applescript - 获取项目信息的问题(applescript)

我是一个非常好的applescripter,并希望得到一些帮助。我正在制作一个类似于 Windows XP 回收站的回收站应用程序。它当然是一个水滴。当我将项目放到应用程序上时,应用程序会启动一个子例程,用于检查是否超出了回收站(垃圾箱)的大小限制。但是,当我尝试获取垃圾箱中项目的信息时,出现的错误消息是:“Finder 出错。找不到文件项目 1。” 我真的需要帮助:(子程序如下:

0 投票
2 回答
6875 浏览

perl - 为什么这个 Perl 会产生“Not a CODE reference”?

我需要在运行时从 Perl 符号表中删除一个方法。我尝试使用 来执行此操作undef &Square::area,它确实删除了该功能,但留下了一些痕迹。具体来说,当$square->area()被调用时,Perl 抱怨它是“不是代码引用”而不是“未定义的子例程 &Square::area called”,这是我所期望的。

你可能会问,“为什么重要?你删除了这个函数,你为什么要调用它?” 答案是我不叫它,Perl 是。Square 继承自 Rectangle,我希望继承链传递$square->area&Rectangle::area,但不是跳过该方法不存在的 Square 然后落入 Rectangle 的 area(),而是方法调用以“不是 CODE 引用”而终止。

奇怪的是,这似乎只发生在 &Square::area 由 typeglob 赋值定义时(例如*area = sub {...})。如果函数是使用标准sub area {}方法定义的,则代码将按预期工作。

同样有趣的是,取消定义整个 glob 按预期工作。只是不取消定义子程序本身。

这是一个简短的示例,说明了症状,并与正确的行为形成对比:

更新:我已经使用 Package::Stash 解决了这个问题(感谢@Ether),但我仍然对它首先发生的原因感到困惑。perldoc perlmod说:

package main;

sub Some_package::foo { ... } # &foo defined in Some_package

这只是编译时 typeglob 赋值的简写:

BEGIN { *Some_package::foo = sub { ... } }

但它似乎不仅仅是简写,因为两者在取消定义函数后会导致不同的行为。如果有人能告诉我这是(1)不正确的文档,(2)perl中的错误,还是(3)PEBCAK,我将不胜感激。

0 投票
2 回答
1334 浏览

perl - perl 子程序参考

我有一组字段,每个字段都有不同的验证规则集。

我已经放置了用于验证哈希引用的子例程引用。

目前它在我的构造函数中,但我想在私有子中将它从构造函数中取出。

我已经完成了如下

现在我想从我的构造函数中取出所有这些验证规则,并想做一些类似下面的事情,这样我就可以更好地控制基于类型字段的验证规则。(假设一些规则在一组字段中很常见我可以通过覆盖字段的值来覆盖其他规则的规则。)

但是我得到了Can't use string ("") as a subroutine ref while "strict refs" in use at...有人可以告诉我为什么这种行为与子参考有关。如果我检查我的姓名键,它会变为 null 或 sub {DUMMY};

0 投票
1 回答
295 浏览

analysis - 架构分析:当所有寄存器都被子程序使用时,机器在跳转到新的子程序之前必须做什么?

在 OO 编程中,我们将小块经常运行的代码组织成方法。与复制/过去相比,这减少了代码总量(以及其他优点)。在汇编语言和机器语言中,这些可重用的块称为子例程。

通常原始例程和调用的子例程会使用许多或大部分可用寄存器。

当所有寄存器都被子程序用完时,解释机器在跳转到新的子程序之前必须做什么。

0 投票
2 回答
2025 浏览

applescript - Applescript 子例程的问题

我是一个相当出色的applescripter,并且已经编写脚本很长时间了。我当前创建的应用程序涉及使用“数据库事件”应用程序。我正在尝试使用子例程设置字段的值。显然,我“无法继续 set_duration”,而且我不知道可能出了什么问题。当前的源代码如下。