我给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)
返回对数组的引用:
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)。
您不能同时分配给两个数组,因为赋值右侧的列表变平并且第一个数组自己吃掉了所有值。
你不能 当您从子目录返回内容时,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)
然后,您可以将它们取消引用到数组变量中,或直接访问它们。
有关参考的更多信息,请参见perlreftut和perlref。