Perl 为什么我能';t将一个参数传递给sub

Perl 为什么我能';t将一个参数传递给sub,perl,Perl,输入是目录名,输出是目录中的文本文件名以及文件名、行数、字数。 当我检查这个程序时,我可以知道第二个子系统什么时候工作,$\uu与“”完全不同 我该怎么修 #!/usr/bin/perl use strict; use warnings; my $dir = <STDIN>; chomp($dir); # remove '\n'(new-line character) from directory address opendir(dirHandle, "$dir"); my @ar

输入是目录名,输出是目录中的文本文件名以及文件名、行数、字数。 当我检查这个程序时,我可以知道第二个子系统什么时候工作,$\uu与“”完全不同

我该怎么修

#!/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;
}
#/usr/bin/perl
严格使用;使用警告;
我的$dir=;
吃($dir);#从目录地址中删除“\n”(新行字符)
opendir(dirHandle,“$dir”);
my@arr=readdir(dirHandle);
关闭(脏手柄);
foreach(@arr){
如果($\ux=~/.txt/){
打印“文件名:$\n”;
我的$tmp=$\ux;
打印“行编号:.”和多少行($)。“\n”;
打印“Word Numb:”&多少个单词($)。“\n\n”;
}
}
分多少行{
打开(文件“$”)| | die“无法打开“$”:$!”;
我的$cnt=0;
while(){
$cnt++;
}
关闭(文件);
返回$cnt;
}
分多少个单词{
打开(文本,“$”)| | die“无法打开“$”:$!”;
#错误!打印的“无法打开”:没有这样的文件或目录
我的$cnt=0;
while(){
my@tmp=split(//,$);
我的$num=@tmp;
$cnt+=$num;
}
关闭(文本);
返回$cnt;
}

您不能使用
$\ucode>引用sub的第一个参数。它应该是
$\u0]
,数组
@
的第一个元素,它是参数列表

在sub中检索参数最惯用(不要与白痴混淆)的方法是:

my $filename = shift;  # shift uses @_ automatically without arguments
Perl允许对标量、数组和散列使用相同的名称:
$foo
@foo
%foo
是不同的实体。将数组
@foo
索引为零时,它将变为
$foo[0]
。这与
$foo
不同