Perl извлекает мультиданные из sub - PullRequest
2 голосов
/ 15 ноября 2011

Я новичок в 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. Один на строку

Не уверен, что я делаю не так в данный момент.

Ответы [ 3 ]

5 голосов
/ 15 ноября 2011

Использовать ссылки на массивы

return(\@alphaData, \@numData);

Как вернуть несколько массивов из подпрограммы?

5 голосов
/ 15 ноября 2011

Возврат ссылок.Ваши два массива сглаживаются при использовании в контексте списка.

return(\@alphaData, \@numData);

Использование:

my ($alpha, $num) = dataMod();
for my $item (@$alpha) {
    ...
}
3 голосов
/ 15 ноября 2011

Так как вы хотите выводить как:

cellCpe2 10
stemClearSte 30
OctuStemPr2 20

Я предполагаю, что эти значения имеют какую-то связь.Так как в cellCpe2 есть значение 10, stemClearSte имеет значение 30, а OctuStemPr2 имеет значение 20. В этом случае вам, вероятно, следует использовать хеш, а не два массива, так как это обеспечит программные связи,Это гарантирует, что вы храните ваши связанные данные вместе.Пример ...

#declare....
my $data = someFunction();

#print the data
foreach my $key (keys %$data) {

  #The reason the notation is not $data{$key}
  #is because you're NOT using a hash here, but
  # a reference to the hash from someFunction
  my $val = $data->{$key};

  print "\n$key $val";
}

#inside function
sub someFunction() {

  # declare a new hash...
  my %data = ();

  while (aCondition) {
    #do some stuff to define val
    my $varA = $val;
    while (bCondition) {
      #do some stuff to define anotherVal
      my $varB = $anotherVal;

      #save in your hash
      $data{$varA} = $varB;
    }
  }

  #return a reference to your hash
  return \%data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...