First off, it's printing 74 with reps because you're printing each time you read a line. Look at how your curly braces are nested.
To make your code a little easier to debug, use some lexicals and use strict.
I don't have the actual data, but try these general changes:
Code:
use strict;
my $data_file="youthbooksc.txt";
open(my $dat, $data_file);
my(%Sortbyshelfkey);
while(<$dat>)
{
chomp;
# No reason to declare @L outside the scope that it's actually used.
my(@L)=split(/\|/, $_);
# This does the same thing your code did but makes it clear that
# you're creating a reference to an anonymous array.
$Sortbyshelfkey{$L[13]}=[@L];
}
foreach my $f (sort keys %Sortbyshelfkey)
{
print "Call #: $Sortbyshelfkey{$f}->[14] \n";
# And this makes it clear that you're dereferencing that array.
}