The two first forms will fail. The rest include a $test, which is a function that will return a scalar for every input; these will be used as keys of a hash whose values will be arrays with the elements that output that key for the test function.

my@years= (2003..2008).map( {Date.new( $_~"-01-01" ) } );

@years.classify( *.is-leap-year , into =>my%leap-years );

say%leap-years;

# OUTPUT: «{False => [2003-01-01 2005-01-01 2006-01-01 2007-01-01],

# True => [2004-01-01 2008-01-01]}␤»

Similarly to .categorize, elements can be normalized by the Callable passed with the :as argument, and it can use the :into named argument to pass a Hash the results will be classified into; in the example above, it's defined on the fly.

Transforms a list of values into a hash representing the classification of those values; each hash key represents the classification for one or more of the incoming list values, and the corresponding hash value contains an array of those list values classified into the category of the associated key. $test will be an expression that will produce the hash keys according to which the elements are going to be classified.

It can also take :as as a named parameter, transforming the value before classifying it:

say<Innie Minnie Moe>.classify( {$_.chars}, :as{lc$_});

# OUTPUT: «{3 => [moe], 5 => [innie], 6 => [minnie]}␤»

This code is classifying by number of characters, which is the expression that has been passed as $test parameter, but the :as block lowercases it before doing the transformation. The named parameter :into can also be used to classify into a newly defined variable: