i cannot get any meaning out of the shuffle over the tied array. in the while, you put everything in three arrays, so the shuffle is pointless.
HOOPS, overlooked a bogus statement as well:
($File[$i++], $Name[$i++], $Keywords[$i++]) = split(/:/);
first, the closing parenthesis is missing. second, you increase $i by every loop by 3! instead, move the incrementing out of it:
($File[$i], $Name[$i], $Keywords[$i]) = split(/:/);
$i ++;
you hardcoded that the arrays will have 24 elemenets. i do not think that is what you wanted. plus, arrays begin counting by zero. consider:
for ($z=0; $z<scalar (@File); $z++) { ... }
you can easily separate html markup from perl code with
HTML::Template.
HTH