标签: subroutine

Perl - 将参数传递给子例程作为哈希键 - 值对问题

我必须将两个引用作为参数传递给子例程(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

perl hash subroutine

5
推荐指数
1
解决办法
9286
查看次数

如何在Perl中打开文件时才打开文件?

如果我有一个打开文件的子程序,那么只有在第一次调用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 file subroutine

5
推荐指数
1
解决办法
261
查看次数

Perl:使用哈希值通过引用调用子例程的问题


在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"需要显式包名.

我的问题是:没有使用中间变量有没有正确的方法来做到这一点?
任何有关这方面的帮助将不胜感激!

perl hash reference subroutine callbyname

5
推荐指数
1
解决办法
2099
查看次数

没有显式接口将未分配的数组传递给例程有什么问题吗?

考虑:

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)我第一次传入一个未分配的数组,但是我没有触及它 - 标准中是否有任何可能导致它以系统相关方式运行的东西?

fortran subroutine

5
推荐指数
1
解决办法
982
查看次数

Perl:从子例程返回后,哈希值发生了变化

我正在使用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 hash return-value subroutine

5
推荐指数
1
解决办法
673
查看次数

perl foreach循环子程序

我知道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)

perl foreach subroutine

5
推荐指数
1
解决办法
878
查看次数

在 Java 方法中省略 public 修饰符

我正在学习 Java,有一些事情困扰着我,教科书没有解释它。

我知道您使用修饰符来声明类和所有内部的方法。但我突然上了一堂课,宣布像

static void(){
}
Run Code Online (Sandbox Code Playgroud)

为什么没有 public 或 private 修饰符,它仍然有效?我可以避免在其他地方使用 public 修饰符吗,或者它是如何工作的?我知道静态意味着该类的成员,而它不返回值则表示无效。然而,为什么不是公共或私人的。

java methods class subroutine

5
推荐指数
1
解决办法
8578
查看次数

我如何参考"罪"?

我可以定义一个子程序并像这样引用它

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,但它在哪个模块?我没有看到任何记录.

perl reference subroutine

5
推荐指数
1
解决办法
105
查看次数

“子程序”和“例程”是同一个概念吗?

我在编程语言书籍中看到过“子例程”和“例程”。它们是同一个概念吗?“子”是什么意思?

我想除了Scott 所著的《编程语言语用学》中的以下示例之外,您可能在计算机科学书籍中见过很多示例:

在第 3.2.2 节中,我们讨论了子程序调用堆栈上的空间分配(图 3.1)。每个例程在调用时都会在堆栈顶部获得一个新的堆栈帧或激活记录。该帧可以包含参数和/或返回值、簿记信息(包括返回地址和保存的寄存器)、局部变量和/或临时变量。当子例程返回时,其帧从堆栈中弹出。

谢谢。

computer-science programming-languages routines subroutine

5
推荐指数
1
解决办法
2985
查看次数

为什么直接绑定 `our &foo` 不起作用,但通过动态查找间接绑定呢?

为什么在模块 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 时出错。

module subroutine rakudo raku

5
推荐指数
1
解决办法
82
查看次数