我是Perl的新手,并且遇到一些问题,找出从sub返回多个数组的最佳方法.这是我的初学者代码.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use List::Util;
use Fcntl 'O_RDONLY';
use Tie::File;
use YAML qw();
my $digitData = 'digitData.txt';
my $alphaData = 'alphaData.txt';
my (@dataA, @dataN) = dataMod();
print Dumper(@dataA);
print Dumper(@dataN);
sub dataMod {
my (@alphaData, @numData);
my $fileCount = `wc -l < $alphaData`;;
chomp $fileCount;
my $history = eval {YAML::LoadFile('history.yaml')} || {};
$history->{$_} && --$history->{$_} for keys %$history;
tie my @alphas, 'Tie::File', $alphaData, mode => O_RDONLY;
tie my @nums, 'Tie::File', $digitData, mode => O_RDONLY;
LINES: for (1 .. $fileCount) {
my @alphaPool = @alphas;
my $pair;
while (@alphaPool) {
my @numberPool = @nums;
my $tryAlpha = splice @alphaPool, rand(@alphaPool), 1;
while (@numberPool) {
my $tryNum = splice @numberPool, rand(@numberPool), 1;
next if $history->{"$tryAlpha|$tryNum"};
@alphas = grep {$_ ne $tryAlpha} @alphas;
@numberPool = grep {$_ != $tryNum} @numberPool;
#print "$tryAlpha $tryNum\n";
push @alphaData, $tryAlpha;
push @numData, $tryNum;
$history->{"$tryAlpha|$tryNum"} = 5;
next LINES;
}
@alphas = grep {$_ ne $tryAlpha} @alphas;
}
}
YAML::DumpFile('history.yaml', $history);
return(@alphaData, @numData);
}
Run Code Online (Sandbox Code Playgroud)
我无法找出从子程序返回数据的最佳方法.我需要保存或能够从这两个变量打印数据:$ tryAlpha $ tryNum一旦返回它们.
目前它返回每个不相关的值.似乎只有一个数组有数据?
当前输出采用以下格式:
$VAR1 = cellCpe2
$VAR2 = stemClearSte
$VAR3 = OctuStemPr2
$VAR4 = 10
$VAR5 = 30
$VAR6 = 20
Run Code Online (Sandbox Code Playgroud)
问题是,我想在子例程中时,当下面的打印语句子内执行时,返回的格式使用它:打印"$ tryAlpha $ tryNum \n";
这个print语句的结果,我需要能够像在print语句中那样使用相同的数据逻辑:ie:$ varForAlphaData $ varForNumData
cellCpe2 10
stemClearSte 30
OctuStemPr2 20
Run Code Online (Sandbox Code Playgroud)
出于测试目的,我使用两个文件*digitData.txt:包含三个单词cellCpe2,stemClearSte,OctuStemPr2.每行一个
*alphaData.txt:包含10,20,30,40,50,60.每行一个
此刻不确定我做错了什么.
返回参考.在列表上下文中使用时,您的两个数组会变平.
return(\@alphaData, \@numData);
Run Code Online (Sandbox Code Playgroud)
用法:
my ($alpha, $num) = dataMod();
for my $item (@$alpha) {
...
}
Run Code Online (Sandbox Code Playgroud)