输入是目录名称,输出是目录中的文本文件名,文件名,行数,字数。 当我检查这个程序时,我可以知道第二个子工作的时候,$ _就像是“”。
我该如何解决?
#!/usr/bin/perl
use strict; use warnings;
my $dir = <STDIN>;
chomp($dir); # remove '\n'(new-line character) from directory address
opendir(dirHandle, "$dir");
my @arr = readdir(dirHandle);
close(dirHandle);
foreach(@arr){
if($_ =~ /.txt/){
print "File Name : $_\n";
my $tmp = $_;
print "Line Numb : ".&how_many_lines($_)."\n";
print "Word Numb : ".&how_many_words($_)."\n\n";
}
}
sub how_many_lines{
open(FILE, "$_") || die "Can't open '$_': $!";
my $cnt=0;
while(<FILE>){
$cnt++;
}
close(FILE);
return $cnt;
}
sub how_many_words{
open(TEXT, "$_") || die "Can't open '$_': $!";
# error! printed "Can't open ''" : No such file or directory
my $cnt=0;
while(<TEXT>){
my @tmp = split(/ /, $_);
my $num = @tmp;
$cnt += $num;
}
close(TEXT);
return $cnt;
}
答案 0 :(得分:1)
您不能使用$_
来引用子的第一个参数。它应该是$_[0]
,数组@_
的第一个元素,它是参数列表。
在sub中检索参数的最惯用(不要与愚蠢的混淆)方法是这样的:
my $filename = shift; # shift uses @_ automatically without arguments
Perl允许标量,数组和散列使用相同的名称:$foo
,@foo
,%foo
是不同的实体。将数组@foo
索引为零时,它变为$foo[0]
。这与$foo
不同。