[英]Perl sorting and regular expressions
我有一個包含如下值的數組:
@array = ("2014 Computer Monitor 200", "2010 Keyboard 30", "2012 Keyboard 80", "2011 Study Desk 100");
我將如何在 Perl 中使用正則表達式按年份、項目名稱和價格對整個數組進行排序? 例如,如果用戶想按價格排序,他們輸入“價格”,然后排序如下:
2010 Keyboard 30 2012 Keyboard 80 2011 Study Desk 100 2014 Computer Monitor 200
到目前為止,我已經能夠像這樣按年份排序:
@array = ("2014 Computer Monitor 200", "2010 Keyboard 30", "2012 Keyboard 80", "2011 Study Desk 100"); $input = ; chomp($input); if ($input eq "year") { foreach $item (sort {$a cmp $b} @array) { print $item . "\n"; } }
/(\\d+) \\s+ (.+) \\s+ (\\S+)/x
將匹配年份名稱和價格,
use strict;
use warnings;
my $order = "price";
my @array = (
"2014 Computer Monitor 200",
"2010 Keyboard 30",
"2012 Keyboard 80",
"2011 Study Desk 100"
);
my %sort_by = (
year => sub { $a->{year} <=> $b->{year} },
price => sub { $a->{price} <=> $b->{price} },
name => sub { $a->{name} cmp $b->{name} },
);
@array = sort {
local ($a, $b) = map {
my %h;
@h{qw(year name price)} = /(\d+) \s+ (.+) \s+ (\S+)/x;
\%h;
} ($a, $b);
$sort_by{$order}->();
} @array;
# S. transform
# @array =
# map { $_->{line} }
# sort { $sort_by{$order}->() }
# map {
# my %h = (line => $_);
# @h{qw(year name price)} = /(\d+) \s+ (.+) \s+ (\S+)/x;
# $h{name} ? \%h : ();
# } @array;
use Data::Dumper; print Dumper \@array;
輸出
$VAR1 = [
'2010 Keyboard 30',
'2012 Keyboard 80',
'2011 Study Desk 100',
'2014 Computer Monitor 200'
];
使用沒有轉換的排序:
use strict;
use warnings;
my @array = ( "2014 Computer Monitor 200", "2010 Keyboard 30", "2012 Keyboard 80", "2011 Study Desk 100" );
my $order = "price";
my @sorted = sort {
local ( $a, $b ) = map { /^(?<year>\d+) \s+ (?<name>.*) \s (?<price>\d+)/x ? {%+} : die "Can't parse $_" } ( $a, $b );
($order ne 'name' ? $a->{$order} <=> $b->{$order} : 0) || $a->{name} cmp $b->{name}
} @array;
print "$_\n" for @sorted;
輸出:
2010 Keyboard 30
2012 Keyboard 80
2011 Study Desk 100
2014 Computer Monitor 200
注意:如果要分揀超過 1 萬個項目,效率可能會成為一個問題,可以使用https://en.wikipedia.org/wiki/Schwartzian_transform
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.