sub two_pass { my @sorted = sort { $b->title =~ /Manager/ <=> $a->title =~ /Manager/ } sort { $a->name cmp $b->name } @employees; } #### Rate obvious subtle two_pass functional obvious 173/s -- -22% -30% -61% subtle 222/s 28% -- -11% -50% two_pass 249/s 44% 12% -- -44% functional 444/s 156% 100% 79% -- #### use v6; class Person { has $.name; has $.title; } sub person($name, $title) { Person.new(:$name, :$title) }; my @employees = person("Eve", "Tech Support"), person("Alice", "Sales Manager"), person("Dave", "Janitor"), person("Fred", "Receptionist"), person("Bob", "Customer Services"), person("Greg", "Finance Manager"), person("Carol", "Marketing Manager"), ; my @sorted = @employees.classify({ .title ~~ /Manager/ ?? 'manager' !! 'staff'})\ .sort.map(*.value.sort(*.name)); say .perl for @sorted; #### Person.new(name => "Alice", title => "Sales Manager") Person.new(name => "Carol", title => "Marketing Manager") Person.new(name => "Greg", title => "Finance Manager") Person.new(name => "Bob", title => "Customer Services") Person.new(name => "Dave", title => "Janitor") Person.new(name => "Eve", title => "Tech Support") Person.new(name => "Fred", title => "Receptionist")