从Perl子程序返回多个数组

Ala*_*am 1 perl subroutine

我给perl子例程提供了四个参数,该例程使用它们创建了两个单独的数组@temp_V@temp_t。当我尝试将它们返回到主程序时,不再有两个单独的数组。取而代之的是@temp_t带有append的值@temp_V,这给了我一个数组。

如何解决这个问题?这是我的代码:

$Vmin=-5;
$Vmax=5;
$N_pulses=5;
$Freq=25e3;

my (@V, @t)=create_FORC($Vmin,$Vmax,$Freq,$N_pulses);

print "@V \n\n\n"; 
#print "@t \n"; 

sub create_FORC($Vmin,$Vmax,$Freq,$N_pulses)
{
my $Vmin=shift;
my $Vmax=shift;
my $Freq=shift;
my $N_pulses=shift;

my $rtime=1/(4*$Freq);
#print "$rtime \n";

undef @temp_V;
undef @temp_t;

push(my @temp_V,0);
push(my @temp_t,0);

push(@temp_V,$Vmin);

      for (my $pulse=0;$pulse<$N_pulses;$pulse++)
      {
      $V_peak=($Vmax-$Vmin)/$N_pulses*($pulse+1)+$Vmin;
      $del_t=($V_peak-$Vmin)*$rtime;  
          push(@temp_V,$V_peak); 
          push(@temp_V,$Vmin);  
          push(@temp_t,$del_t);
      } 
 push(@temp_V,0);

 print "@temp_V \n";
 print "@temp_t \n";

return (@temp_V, @temp_t); 

}
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 6

返回对数组的引用:

return \@temp_v, \@temp_t
Run Code Online (Sandbox Code Playgroud)

分配给实际数组时,您需要取消引用它们:

my ($V_ref, $t_ref)=create_FORC($Vmin,$Vmax,$Freq,$N_pulses);
Run Code Online (Sandbox Code Playgroud)

然后使用@$V_ref而不是@V(和类似地用于@$t_ref@t)。

您不能同时分配给两个数组,因为赋值右侧的列表变平并且第一个数组自己吃掉了所有值。


sim*_*que 5

你不能 当您从子目录返回内容时,Perl将返回一个列表。没有关于从子中出来之前数组中有多少元素的信息。

列表在Perl中是平坦的。它们不能嵌套。

(1, 2, (3, 4), ((), 5, (6)), 7)
Run Code Online (Sandbox Code Playgroud)

这等效于:

(1, 2, 3, 4, 5, 6, 7)
((1), (2), (3), (4), (5), (6), (7))
Run Code Online (Sandbox Code Playgroud)

如果要返回两个不同的数组,则需要返回对其的引用。

sub foo {
    my @bar = qw/a b c/;
    my @qrr = qw/1 2 3/;

    return \@bar, \@qrr;
}

my ($letters, $numbers) = foo();
Run Code Online (Sandbox Code Playgroud)

然后,您可以将它们取消引用到数组变量中,或直接访问它们。

有关参考的更多信息,请参见perlreftutperlref