Я новичок в Perl, и у меня возникли проблемы с поиском наилучшего способа вернуть несколько массивов из подпрограммы. Вот мой код для начала.
#!/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);
}
У меня проблемы с поиском наилучшего способа вернуть данные из подпрограммы. Мне нужно сохранить или иметь возможность печатать данные из этих двух переменных: $ tryAlpha $ tryNum вместе, как только они будут возвращены.
В настоящее время он возвращает каждое значение, отсоединенное. Похоже, что только один массив имеет данные?
Текущий вывод в следующем формате:
$VAR1 = cellCpe2
$VAR2 = stemClearSte
$VAR3 = OctuStemPr2
$VAR4 = 10
$VAR5 = 30
$VAR6 = 20
Проблема в том, что я хотел бы использовать его в формате, который возвращается в подпрограмме, когда в подпрограмме выполняется следующий оператор печати:
выведите "$ tryAlpha $ tryNum \ n";
В результате этого оператора печати мне нужно иметь возможность использовать ту же логику для данных, что и в операторе печати:
то есть: $ varForAlphaData $ varForNumData
cellCpe2 10
stemClearSte 30
OctuStemPr2 20
В целях тестирования я использую два файла
* digitData.txt: содержит три слова cellCpe2, stemClearSte, OctuStemPr2. Один на линию
* alphaData.txt: содержит 10, 20, 30, 40, 50, 60. Один на строку
Не уверен, что я делаю не так в данный момент.