#!/usr/bin/env perl
use utf8;
use strict;
use Text::CSV;
use Encode 'encode';
### read the output
my $resultsFile = "results.txt";
open my $fh, "<:encoding(utf8)", $resultsFile
or die "cannot open re +sults file $resultsFile for reading: $!";
my @urls = grep {/\/search\//} <$fh>;
close ($fh);
print "Content-type: text/html; charset=utf-8\n\n";
print "<h2>Pre-sort</h1><ul>";
print "<li>$_</li>" for @urls;
print "</ul>\n";
print "<h2>Same, but encoded</h2><ul>";
print encode ('UTF-8', "<li>$_</li>") for @urls;
print "</ul>\n";
# sort @urls based on the search string
my @sorted_urls =
map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { m|/search/\s*([^\?]+)\?|; [$_, $1] } @urls;
my $csv = Text::CSV->new ({binary => 0, sep_char => "|"});
print "<h2>Broken sorted</h2>\n";
# parse and print
print '<table>';
foreach my $row (@sorted_urls) {
# print TEMP $row;
$csv->parse ($row);
my @els = $csv->fields;
$els[0] =~ /\/search\/(.+)\?scope=/i;
my ($term) = $1;
my ($link) = $els[0];
print "<tr>";
print qq#<td><a href="$link" target="_blank">$term</a></td>#;
print "<td>$_</td>\n" for @els[1 .. 4];
print "</tr>\n";
}
print '</table>';
print "<h2>Same, but encoded</h2>";
# parse and print
print '<table>';
foreach my $row (@sorted_urls) {
# print TEMP $row;
$csv->parse ($row);
my @els = $csv->fields;
$els[0] =~ /\/search\/(.+)\?scope=/i;
my ($term) = $1;
my ($link) = $els[0];
print "<tr>";
print encode ('UTF-8',
qq#<td><a href="$link" target="_blank">$term</a></td>#);
print "<td>$_</td>\n" for @els[1 .. 4];
print "</tr>\n";
}
print '</table>';
Hopefully you can see here that you just need to ensure that you properly encode the output. There are many ways to do this, I've picked one here which is very explicit, for your benefit. See Encode for lots more on how to use this module. |