我根本没有grol Perl子程序属性.
我从未在实际代码中看到它们perldoc perlsub而且perldoc attributes未能回答我的问题:
如果有人能够以他们应该的方式使用属性的详细示例,那将会很棒.
对于那些和我一样无能为力的人,属性是attributes SYNOPSIS下面例子中冒号后面的参数:
sub foo : method ;
my ($x,@y,%z) : Bent = 1;
my $s = sub : method { ... };
use attributes (); # optional, to get subroutine declarations
my @attrlist = attributes::get(\&foo);
use attributes 'get'; # import the attributes::get subroutine
my @attrlist = get \&foo;
Run Code Online (Sandbox Code Playgroud) 我想在同一个模块中调用另一个子内部的子.第一个子将是我的主要代码,在那里我将调用第二个子例程.第二个子程序接收多个输入,如整数,双,双数组和双矩阵.数组和矩阵的大小是已知的并存储在整数变量中.该子也返回几个输出.所以,我想做这样的事情.
sub Main()
Nc As integer
Dim kij(1 To Nc, 1 To Nc), xi(1 to Nc), a1 As Double
'I assign values to my variables from the excelsheet e.g. Nc=Cells(1,1) etc.
CalculateA(Nc,kij, xi, a1, a)
Cells(5,5)=a
end sub
sub CalculateA(Nc as integer,kij as matrix double, xi as array double, a as Double)
a=0
For i=1 To Nc
For j=1 To Nc
a = a + kij(i,j)*x(i)*x(j)
Next j
Next i
a = a*a1
end sub
Run Code Online (Sandbox Code Playgroud)
它是如何知道哪个子元素是它开始运行的主要子元素.我可以将辅助子设置在顶部,代码以某种方式从底部子例程开始吗?
我有一个调用该函数的代码.但我不知道这个功能属于哪个模块.我需要它来修改这个功能.
我怎么检查呢?
需要帮助搞清楚如何做到这一点.我的代码:
my %hash;
$hash{'1'}= {'Make' => 'Toyota','Color' => 'Red',};
$hash{'2'}= {'Make' => 'Ford','Color' => 'Blue',};
$hash{'3'}= {'Make' => 'Honda','Color' => 'Yellow',};
&printInfo(%hash);
sub printInfo{
my (%hash) = %_;
foreach my $key (keys %_{
my $a = $_{$key}{'Make'};
my $b = $_{$key}{'Color'};
print "$a $b\n";
}
}
Run Code Online (Sandbox Code Playgroud) 我只是好奇为什么会选择在Perl中使用匿名子程序而不是命名子程序.谢谢.
我想将所有subs暴露给我的命名空间,而不必一次列出一个:
@EXPORT = qw( firstsub secondsub third sub etc );
Run Code Online (Sandbox Code Playgroud)
使用完全限定名称需要对现有代码进行大量更改,因此我宁愿不这样做.
有没有@EXPORT_ALL?
我认为文档说这是一个坏主意,但无论如何我还是想做,或者至少知道如何做.
为了回答Jon的原因:现在为了快速重构,我想将一堆sub转移到他们自己的包中,对现有脚本进行最少的麻烦和代码更改(这些子当前使用并经常重复).
而且,大多数情况下,我只是好奇.(因为看起来出口商似乎也可以将其作为标准功能,但到目前为止基于答案有点令人惊讶,但事实并非如此)
我有一组子程序,如下所示:
sub foo_1($) {
my $name = shift;
my $f;
run_something();
open($f, $name) or die ("Couldn't open $name");
while (<$f>) {
//Something for foo_1()
}
close($f);
do_something_else();
}
Run Code Online (Sandbox Code Playgroud)
我有四个或更多看起来相同,唯一改变的是while块的主体.我想抽象一下并停止复制粘贴代码.
为了给出更多的上下文,不同的foo子程序是一个不同的有限状态机(FSM),它读取不同文件的内容并将数据提供给哈希引用.也许比我想要完成的事情更聪明.
RemoveAllFilesByExtenstion例如,在C#中,子程序可以是这样的符号:
void RemoveAllFilesByExtenstion(string targetFolderPath, string ext)
{
...
}
Run Code Online (Sandbox Code Playgroud)
和使用像:
RemoveAllFilesByExtenstion("C:\Logs\", ".log");
Run Code Online (Sandbox Code Playgroud)
如何使用PowerShell脚本文件(ps1)中的相同签名来定义和调用子例程?
我想扫描一个代码库,以识别目前无法访问的未定义子例程的所有实例.
举个例子:
use strict;
use warnings;
my $flag = 0;
if ( $flag ) {
undefined_sub();
}
Run Code Online (Sandbox Code Playgroud)
当$flag计算结果为true时,将发出以下警告:
Undefined subroutine &main::undefined_sub called at - line 6
Run Code Online (Sandbox Code Playgroud)
我不想依赖于在运行时发出的警告来识别未定义的子例程
在strict和warnings编译指示不帮助这里.use strict 'subs'没有效果.
甚至以下代码片段也是静默的
$ perl -Mstrict -we 'exit 0; undefined_sub()'
Run Code Online (Sandbox Code Playgroud)我正在学习perl并且理解使用shift解包子例程参数是一种常见且公认的做法.我也理解省略函数参数以使用默认@_数组是常见且可接受的做法.
考虑到这两件事,如果你调用一个没有参数的子程序,就@_可以改变can(并且如果使用shift).这是否意味着使用默认参数调用另一个子例程,或者事实上,@_在此之后使用数组,这被认为是不好的做法?考虑这个例子:
sub total { # calculate sum of all arguments
my $running_sum;
# take arguments one by one and sum them together
while (@_) {
$running_sum += shift;
}
$running_sum;
}
sub avg { calculate the mean of given arguments
if (@_ == 0) { return }
my $sum = &total; # gets the correct answer, but changes @_
$sum / @_ # causes division by zero, since @_ is now empty
} …Run Code Online (Sandbox Code Playgroud)