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.
请帮助
答案 0 :(得分: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;
和use warnings;
。 Perl专家使用它们来确保它们没有犯下愚蠢的错误。新手也应该这样做。
答案 1 :(得分:2)
open ($fn), $file;
删除括号。
第一个参数是文件句柄,第二个参数是文件名。您使用$fn
作为文件名和文件句柄,而$file
从未定义。
if (! -e "$fh") $fh="STDIN";
你不能在这样的街区周围留下大括号。我也不确定$fh
应该是什么,因为你再也不会使用它了。
你似乎对Perl的语法感到困惑。你是如何学习Perl的?
答案 2 :(得分:1)
您可能在文件名$file
和文件句柄$fh
尝试将前三行更改为
my $file= "words.txt";
if (! -e $file) {
my $fh = *STDIN;
} else {
open my $fh, '<', $file;
}
$fn
似乎有拼写错误。不应该是$fh
?
答案 3 :(得分: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
进行操作。