2017-05-03 17 views
0

私のアプリケーションのソート機能に問題があります。 lnameキーのハッシュのハッシュをinstructorsの下でソートする必要があります。従来の アプリケーションはPerlで書かれています。このカスタムハッシュの値をperlのハッシュでソートする方法

ここでは、並べ替える必要があるハッシュのダンプです。上記構成において

$VAR1 = { 
     'instructors' => [ 
         { 
          'is_placeholder' => 0, 
          'lname' => 'Lordy', 
          'name' => 'Daniel Lordy' 
         }, 
         { 
          'is_placeholder' => 0, 
          'lname' => 'Fisher', 
          'name' => 'Bethy Fisher' 
         }, 
         { 
          'is_placeholder' => 0, 
          'lname' => 'Jaya', 
          'name' => 'Jennifer Jaya' 
         }, 
         ], 
     'id' => '1237058', 
     'XXX' => { 
        'name' => 'Fall 2015 MFT Master 695', 
       }, 
     'YYY' => '45' 
    }; 

インストラクターキーも空にすることができます。例については :私のアプリケーションで

$VAR1 = { 
     'instructors' => [], 
     'id' => '1237058', 
     'XXX' => { 
        'name' => 'Fall 2015 MFT Master 695', 
       }, 
     'YYY' => '45' 
    }; 

、ユーザーが講師名に基づいて列をソートするオプションがあります。したがって、ユーザーが昇順で並べ替えると、開始時にインストラクターが空の行が表示され、その後、昇順でソートされたインストラクター名が各行にある残りの行が表示されます。その逆も同様です。

これまで私が試したコードです。

if($sort_order eq 'ASC') { 
    foreach my $elem (@$course_sections) { 
    my @sorted = map { $_->[1] } 
        sort { $a->[0] cmp $b->[0] } 
        map { [$_->{'lname'}, $_] } @{$elem->{'instructors'}}; 

} 
if($sort_order eq 'DESC') { 
    foreach my $elem (@$course_sections) { 
    my @sorted = map { $_->[1] } 
        sort { $b->[0] cmp $a->[0] } 
        map { [$_->{'lname'}, $_] } @{$elem->{'instructors'}}; 

} 

どのように私はこの@sortedハッシュが@$course_sections内の行の順序に影響を与え得るのです。簡単な方法があれば教えてください。

ありがとうございました。

+1

不足している '' 'と'、 'を修正しました。次回から手作業でデータ構造を構築するときには、より注意が必要です。 '$ VAR1'は' @ $ course_sections'の要素の1つですか? – simbabque

+1

'@ sorted'は配列であり、ハッシュではありません。 '$ course_sections'の各要素は一行ですか? [編集]し、期待される出力を表示してください。 – simbabque

+0

全体的なデータ構造を変更できますか?私。 「講師」を適切に並べ替えることはできますか? – simbabque

答えて

4

instructors配列refを、foreachループで作成したソート済みのバージョンに置き換える必要があります。そうすれば、個々の行の指導者をソートすることができます。次に、$course_sections全体を各行の最初のインストラクターの名前で並べ替えることができます。

# sort the instructors in-place 
foreach my $elem (@$course_sections) { 
    $elem->{'instructors'} = [ 
     map { $_->[1] } 
     sort { $a->[0] cmp $b->[0] } 
     map { [ $_->{'lname'}, $_ ] } @{ $elem->{'instructors'} } 
    ]; 
} 

# sort the courses by first instructor 
$course_sections = [ 
    map  { $_->[1] } 
     sort { $a->[0] cmp $b->[0] } 
     map { [ ($_->{'instructors'}->[0] ? $_->{'instructors'}->[0]->{'lname'} : q{}), $_ ] } 
     @$course_sections 
]; 

cmpが爆破されませんので、空の文字列とundef値を置き換えてください。私たちは$_->{'instructors'}->[0]->{'lname'} // q{}を実行してはいけません。なぜなら、自動化は私たちのデータ構造に空のものをたくさん作成するかもしれないからです。

my $course_sections = [ 
    { 
     'instructors' => [ 
      { 
       'is_placeholder' => 0, 
       'lname'   => 'Lordy', 
       'name'   => 'Daniel Lordy' 
      }, 
      { 
       'is_placeholder' => 0, 
       'lname'   => 'Fisher', 
       'name'   => 'Bethy Fisher' 
      }, 
      { 
       'is_placeholder' => 0, 
       'lname'   => 'Jaya', 
       'name'   => 'Jennifer Jaya' 
      }, 
     ], 
     'id' => '1237058', 
     'XXX' => { 
      'name' => 'Fall 2015 MFT Master 695', 
     }, 
     'YYY' => '45' 
    }, 
    { 
     'instructors' => [], 
     'id'   => '1237058', 
     'XXX'   => { 
      'name' => 'Fall 2015 MFT Master 695', 
     }, 
     'YYY' => '45' 
    } 
]; 

をそして、これは、Data ::プリンタとダンプ、出力されます。ここでは

はあなたの例のデータが一緒に引っ張られます。

\ [ 
    [0] { 
     id   1237058, 
     instructors [], 
     XXX   { 
      name "Fall 2015 MFT Master 695" 
     }, 
     YYY   45 
    }, 
    [1] { 
     id   1237058, 
     instructors [ 
      [0] { 
       is_placeholder 0, 
       lname   "Fisher", 
       name    "Bethy Fisher" 
      }, 
      [1] { 
       is_placeholder 0, 
       lname   "Jaya", 
       name    "Jennifer Jaya" 
      }, 
      [2] { 
       is_placeholder 0, 
       lname   "Lordy", 
       name    "Daniel Lordy" 
      } 
     ], 
     XXX   { 
      name "Fall 2015 MFT Master 695" 
     }, 
     YYY   45 
    } 
] 
+1

恐ろしいコード。それは魅力のように働いた。オートバイ化に関連する知識を共有してくれてありがとう、以前はそれを知らなかった。申し訳ありませんが、前のコメントに返信できませんでした。 –

関連する問題