我必须将两个引用作为参数传递给子例程(buildRanges)作为哈希键 - 值对,如下所示
例:
@array = (“0A0”, “005”, “001”, “004”, “0BC”, “004”, “002”, “001”);
@ranges = ();
$numRanges = buildRanges(VALUES => \@array, REF_RANGES=>\@ranges);
Run Code Online (Sandbox Code Playgroud)
我的问题是
1.上面的子程序调用的语法是否正确?
2. VALUES和REF_RANGES是什么?
坦率地说,我无法理解子程序调用,但我被告知只能使用该调用.
谢谢.
KK
如果我有一个打开文件的子程序,那么只有在第一次调用subrountine时才能确保它打开它的最佳方法是什么?我有这个但不确定它是否是最佳实践:
{
my $count = 0;
sub log_msg {
my ($msg,$name) = @_;
if ($count == 0) {
my $log_file_name = "/tmp/" . $name;
open my $log_fh,">",$log_file_name or croak "couldn't open $log_file_name : $!";
print $log_fh "$timestamp: created and opened $log_file_name\n";
}
$count++;
}
}
Run Code Online (Sandbox Code Playgroud)
在Perl中,您可以通过引用(或名称)调用函数,如下所示:
my $functionName = 'someFunction';
&$functionName();
#someFunction defined here:
sub someFunction { print "Hello World!"; }
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用哈希值,如下所示:
my %hash = (
functionName => 'someFunction',
);
&$hash{functionName}();
#someFunction defined here:
sub someFunction { print "Hello World!"; }
Run Code Online (Sandbox Code Playgroud)
我得到的错误是全局符号"$ hash"需要显式包名.
我的问题是:没有使用中间变量有没有正确的方法来做到这一点?
任何有关这方面的帮助将不胜感激!
考虑:
program main
real, allocatable, dimension(:) :: foo
integer n
n=10
call dofoo(foo,n,1)
allocate(foo(n))
call dofoo(foo,n,0)
end program main
subroutine dofoo(foo,n,mode)
real foo(n)
integer i,n,mode
if(mode.eq.1)then
n=6
return
endif
do i=1,n
foo(i)=i
enddo
return
end subroutine dofoo
Run Code Online (Sandbox Code Playgroud)
上面的代码有什么问题吗?(它适用于gfortran)我第一次传入一个未分配的数组,但是我没有触及它 - 标准中是否有任何可能导致它以系统相关方式运行的东西?
我正在使用perl中的哈希,但是不明白为什么哈希值会在以下内容中发生变化:
use strict;
sub test
{
my ($value_ref) = @_;
my %value = %$value_ref;
$value{'abc'}{'xyz'} = 1;
}
my %hash;
$hash{'abc'}{'xyz'} = 0;
test (\%hash);
print "$hash{'abc'}{'xyz'}\n";
Run Code Online (Sandbox Code Playgroud)
以上返回1,为什么它不会像这样返回0呢?
use strict;
sub test
{
my ($value_ref) = @_;
my %value = %$value_ref;
$value{'abc'} = 1;
}
my %hash;
$hash{'abc'} = 0;
test (\%hash);
print "$hash{'abc'}\n";
Run Code Online (Sandbox Code Playgroud)
我想它与我如何传递%hash有关.我错过了什么?
我知道perl中的子程序通过引用传递arg.但是在下面的代码中,子例程中的foreach循环不应该更改值,@list因为它my $i应该创建一个新的词法范围var $i.任何赋值$i应该是词法范围,但不能改变@list值.
任何人都可以解释在foreach循环中发生的导致值更改的内容@list吗?
sub absList {
foreach my $i (@_) {
$i = abs($i);
}
}
@list = (-2,2,4,-4);
absList(@list);
print "@list";
Run Code Online (Sandbox Code Playgroud)
输出:
2 2 4 4
Run Code Online (Sandbox Code Playgroud) 我正在学习 Java,有一些事情困扰着我,教科书没有解释它。
我知道您使用修饰符来声明类和所有内部的方法。但我突然上了一堂课,宣布像
static void(){
}
Run Code Online (Sandbox Code Playgroud)
为什么没有 public 或 private 修饰符,它仍然有效?我可以避免在其他地方使用 public 修饰符吗,或者它是如何工作的?我知道静态意味着该类的成员,而它不返回值则表示无效。然而,为什么不是公共或私人的。
我可以定义一个子程序并像这样引用它
sub F { q(F here) }
$f = \&F;
print &$f # prints “F here”
Run Code Online (Sandbox Code Playgroud)
但是我怎么能这样做,例如sin?
$f = \&sin;
print &$f # error: Undefined subroutine &main::sin called
Run Code Online (Sandbox Code Playgroud)
听起来好像我应该可以使用\&MODULE::sin; 明显地cos不在main,但它在哪个模块?我没有看到任何记录.
我在编程语言书籍中看到过“子例程”和“例程”。它们是同一个概念吗?“子”是什么意思?
我想除了Scott 所著的《编程语言语用学》中的以下示例之外,您可能在计算机科学书籍中见过很多示例:
在第 3.2.2 节中,我们讨论了子程序调用堆栈上的空间分配(图 3.1)。每个例程在调用时都会在堆栈顶部获得一个新的堆栈帧或激活记录。该帧可以包含参数和/或返回值、簿记信息(包括返回地址和保存的寄存器)、局部变量和/或临时变量。当子例程返回时,其帧从堆栈中弹出。
谢谢。
为什么在模块 TEST 之外调用时 r1 和 r2 之间存在差异?
module TEST {
our &r1 := OUR::{'&r1'} := sub {
say 'routine 1'
}
r1(); # routine 1
our &r2 := sub {
say 'routine 2'
}
r2(); # routine 2
}
import TEST;
say TEST::.keys; # (&r1 &r2)
TEST::r1(); # routine 1
TEST::r2(); # Cannot invoke this object (REPR: Uninstantiable; Callable) ...
Run Code Online (Sandbox Code Playgroud)
尝试在定义它的模块 TEST 之外运行子例程 r2 时出错。