On Mon, Mar 15, 2021 at 8:57 PM Denton Liu <liu.denton@xxxxxxxxx> wrote: > In the previous few commits, we sorted many lists into ASCII-order. In > order to ensure that they remain that way, add the 'check-sort' target. > [...] > Signed-off-by: Denton Liu <liu.denton@xxxxxxxxx> > --- > +my @regexes = map { qr/^$_/ } @ARGV; > +my $last_regex = 0; > +my $last_line = ''; > +while (<STDIN>) { > + my $matched = 0; > + chomp; > + for my $regex (@regexes) { > + next unless $_ =~ $regex; > + if ($last_regex == $regex) { > + die "duplicate lines: '$_'\n" unless $last_line ne $_; > + die "unsorted lines: '$last_line' before '$_'\n" unless $last_line lt $_; > + } > + $matched = 1; > + $last_regex = $regex; > + $last_line = $_; > + } > + unless ($matched) { > + $last_regex = 0; > + $last_line = ''; > + } > +} This is, of course, endlessly bikesheddable. Here is a shorter -- and, at least for me, easier to understand -- way to do it: my $rc = 0; chomp(my @all = <STDIN>); foreach my $needle (@ARGV) { my @lines = grep(/^$needle/, @all); if (join("\n", @lines) ne join("\n", sort @lines)) { print "'$needle' lines not sorted\n"; $rc = 1; } } exit $rc; By the way, it might be a good idea to also print the filename in which the problem occurred. Such context can be important for the person trying to track down the complaint. To do so, you'd probably want to pass the filename as an argument, and open and read the file rather than sending it only as standard-input.