按日期对对象的Perl数组进行排序

时间:2014-05-10 16:52:43

标签: arrays perl sorting

我需要按@list订购insertDate数组,但是如何才能访问它,因为它是$obj数组?

我尝试了Perl的sort功能,但我不了解这种由$obj组成的数组是如何工作的。

sub getLastQuestions {
  my ($page) = @_;
  $page ||= 1;

  my $questionPerPage = 30;
  my @list            = [];

  my @questions = $db->findNodes("/db/questions/question");

  if (@questions) {
    foreach my $question (@questions) {
      my $id         = $question->findvalue("\@id");
      my $title      = $question->findvalue("title");
      my $author     = $question->findvalue("author");
      my $insertDate = $question->findvalue("insertDate");

      my $obj = Model::Question->new(
        path       => "vedi-domanda.cgi?id=" . $id,
        title      => $title,
        author     => $author,
        insertDate => $insertDate
      );

      # Aggiungi uno
      push @list, $obj;
    }
  }

  return @list;
}

1 个答案:

答案 0 :(得分:3)

请注意,不需要

if (@questions) { ... }

,因为

foreach my $question (@questions) { ... }
如果数组为空,

将不会执行

您初始化@list时还存在一个错误,您将其设置为[]。这不会清空数组 - 它将其设置为包含对空数组的引用的一个元素。只需my @list即可。

最简单的方法是在将@questions数组转换为Model::Question个对象数组之前对其进行排序。

确切的代码完全取决于XML中日期字符串的格式,但如果它们格式正确,如ISO 8601日期,则可以将它们排序为字符串以获得所需的效果。所以你可以写

  my @questions = sort {
    my ($aa, $bb) = map $_->findvalue('insertDate'), ($a, $b);
    $aa cmp $bb;
  } $db->findNodes('/db/questions/question');

请注意,您尚未显示日期字符串的格式,因此如果没有其他额外的编码,这可能无效

您可能还想使用map将XML节点转换为Model::Question个对象,正如我在此子例程中所示

sub get_last_questions {

  my ($page) = @_;
  $page ||= 1;

  my $_PerPage = 30;

  my @questions = sort {
    my ($aa, $bb) = map $_->findvalue('insertDate'), ($a, $b);
    $aa cmp $bb;
  } $db->findNodes('/db/questions/question');

  my @list = map {
    Model::Question->new(
      path       => 'vedi-domanda.cgi?id=' . $_->findvalue('@id'),
      title      => $_->findvalue('title'),
      author     => $_->findvalue('author'),
      insertDate => $_->findvalue('insertDate'),
    );
  } @questions;

  return @list;
}