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.
Fix:
my ($aDate) = $a =~ /\bdate:\s*"(\d{4}-\d{2}-\d{2})"/; my ($bDate) = $b =~ /\bdate:\s*"(\d{4}-\d{2}-\d{2})"/;
Also:
- Added \b to avoid catching enddate.
- Added \s* in case the JSON encoder decides to start adding whitespace.
- Removed some superfluous backslashes.
Note: Will break if you get
- { date:"\u0032015-05-01", content:"erwa" }
- { foo:{date:"2014-05-01"}, date:"2015-05-01", content:"erwa" }
- etc
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.
|
---|
In Section
Seekers of Perl Wisdom