В первой строке у вас проблема с приоритетом:
open F, $ARGV[0] || die $!;
такой же как
open F, ($ARGV[0] || die $!);
что означает, что die
выполняется, если имя файла ложно, а не в случае сбоя open
. Ты хотел сказать
open(F, $ARGV[0]) || die $!;
or
open F, $ARGV[0] or die $!;
Кроме того, вы должны использовать 3-аргументную форму open, если $ARGV[0]
содержит символы, которые что-то значат для open
.
open F, '<', $ARGV[0] or die $!;
С другой стороны, разделение на /\s/
означает, что вы получаете «слово» между последовательными символами пробела. Вероятно, вы имели в виду /\s+/
или, как предложил амфетамин, /\W+/
, в зависимости от того, как вы хотите определить «слово».
Это по-прежнему оставляет проблему пустого «слова», которое вы получаете, если строка начинается с пробела. Вы можете разделить на ' '
, чтобы подавить это (это особый случай), или вы можете сначала обрезать начальные пробелы, или вставить grep { length $_ }
, чтобы отсеять пустые «слова», или отказаться от split
и использовать другой метод подсчета слов.
Построчная обработка вместо одновременного чтения всего файла также была бы хорошим улучшением, но это не так важно, как первые два пункта.
person
cjm
schedule
21.10.2010