in reply to sorting a file by a date:"YYYY-MM-DD" field with cmp

In scalar context, the match operator and thus the bind operator returns whether a match was found or not. You want to evaluate the match in list context to get it to return the list of matches.


my ($aDate) = $a =~ /\bdate:\s*"(\d{4}-\d{2}-\d{2})"/; my ($bDate) = $b =~ /\bdate:\s*"(\d{4}-\d{2}-\d{2})"/;


Note: Will break if you get

For a reliable but slower solution, you can use

use JSON::XS qw( decode_json ); my @sorted = map { substr($_, 10) } sort map { decode_json($_)->{date} . $_ } @events;

As for the blank lines, just remove them first using

@events = grep /\S/, @events;

Update: Added to my answer.