1
my $fn= "words.txt";
open ($fn), $file;
if (! -e "$fh") $fh="STDIN";
while (<$fn>){;
    my $total_words = @words; #All word count
    my %count;
    $count{$_}++ for @words; # Here are the counts
    my $uniq_words  = scalar keys %count; # Number of uniq words
}
# Print sorted by frequency

print "$_\t$count{$_}" for (sort { $count{$b} <=> $count{$a} } keys %count);

close FILE;
exit 0

我收到此错误:

Scalar found where operator expected at wordlist.pl line 8, near ") $fh"
        (Missing operator before $fh?)
syntax error at wordlist.pl line 8, near ") $fh"
Execution of wordlist.pl aborted due to compilation errors.

请帮忙

4

4 回答 4

8

Perl总是需要在条件之后用大括号括住代码:

你写了:

if (! -e "$fh") $fh="STDIN";

你应该写:

if (! -e "$fh") { $fh="STDIN"; }

或者:

$fh = "STDIN" if ! -e "$fh";

这些在语法上是正确的。不过,代码在语义上被分割成碎片。要打开文件,请使用:

open my $fh, '<', $fn or die "Failed to open $fn";

并且始终使用use strict;and use warnings;。Perl 专家使用它们来确保他们没有犯愚蠢的错误。新手也应该​​这样做。

于 2013-10-29T04:00:21.467 回答
2
open ($fn), $file;

去掉这里的括号。

第一个参数是文件句柄,第二个是文件名。您$fn同时用作文件名和文件句柄,而$file从未定义。

if (! -e "$fh") $fh="STDIN";

你不能像这样在一个街区周围离开大括号。我也不确定$fh应该是什么,因为您再也不会使用它了。

您似乎对 Perl 的语法感到困惑。你是如何学习 Perl 的?

于 2013-10-29T03:42:34.033 回答
1

$file可能您对文件名和文件句柄感到困惑$fh

尝试将前三行更改为

my $file= "words.txt";
if (! -e $file) {
  my $fh = *STDIN;
} else {
  open my $fh, '<', $file;
}

而且好像有错别字$fn。不应该$fh吗?

于 2013-10-29T03:42:35.877 回答
1

你的理解open是不正确的。将它与三参数调用一起使用的现代方式通常是:

open my $fh, '<', <file name> or die $!;

您指定一个新的文件句柄对象作为第一个参数,而不是文件名。您也不需要打开文件来检查它是否存在。因此,与其这样做,不如按照以下方式做一些事情:

my $file = 'words.txt';
if (! -e $file) {
  print "$file does not exist\n";
}
else {
 # open your file here and remember to close it
}

然后只要不存在就使用特殊的菱形算子<>进行操作。STDIN

于 2013-10-29T03:58:31.957 回答