用于打印目录中的文件及其内容的代码

时间:2014-09-09 13:13:10

标签: perl

下面提到的是在执行时抛出以下错误 - :

Global symbol "@files" requires explicit package name at ./q1.pl line 6.
Global symbol "$i" requires explicit package name at ./q1.pl line 6.
Global symbol "@files" requires explicit package name at ./q1.pl line 17.

有人可以解释我如何缓解此问题,并帮助我进一步优化代码

#!/usr/bin/perl
use warnings;
use strict;

sub print_file {
    open FILE, $files[$i];
    while(my $line = <FILE>) {
        print $line;
    }
}

sub globdir {
    my $dir = shift;
    @files = glob "$dir/*";
    $i = 0;
    while($i <= $#files) {
        print("Files in the directory $files[$i] \n");
        $i++;
        print_file $files;
    }
}

globdir @ARGV;

3 个答案:

答案 0 :(得分:1)

您应该在每个perl脚本的顶部包含use strict;use warnings;,就像您在此处所做的一样。

这将告诉您的一件事是,当您未能使用my声明变量时,这将有助于您避免代码中出现简单的拼写错误。

错误:

Global symbol "@files" requires explicit package name at ./q1.pl line 6.

通过声明变量来修复:

my @files = glob "$dir/*";

这应该足以让您修复代码中的其他错误。但是,我建议您将代码简化为以下内容:

#!/usr/bin/perl
use strict;
use warnings;
use autodie;

my $dir = shift;

for my $file (<$dir/*>) {
    print "File in the directory: $file\n";

    # Output File Contents:
    open my $fh, '<', $file;
    print <$fh>;
}

答案 1 :(得分:0)

当您添加第use strict行时,Perl会告诉您有关您正在使用但未声明的变量的信息。关于$i的错误是因为您在未声明变量的情况下使用变量$i。第一次使用时将$i更改为my $i,您就可以了。

$i = 0;

变为

my $i = 0;

@files它更复杂。您已在print_fileglobdir两个函数中使用它。为此,您需要输入:

my @lines;

在第一个函数之前。但你可能不想这样做。您尝试将文件名作为参数传递给print_file,但不使用它。要获得您传递的文件名,请在print_file之前的代码中添加:

my $filename = shift;

所以你得到:

sub print_file {
    my $filename = shift;
    open FILE, $filename;
    while(my $line = <FILE>) {
        print $line;
    }
}

并且您在@files中不需要print_file。但您还需要使用文件名称调用print_file函数,因此您需要:

print_file $files[$i];

你需要在`@ files&#39;之前加my

所以我们现在有:

#!/usr/bin/perl
use warnings;
use strict;

sub print_file {
    my $filename = shift;
    open FILE, $filename;
    while(my $line = <FILE>) {
        print $line;
    }
}

sub globdir {
    my $dir = shift;
    my @files = glob "$dir/*";
    my $i = 0;
    while($i <= $#files) {
        print("Files in the directory $files[$i] \n");
        $i++;
        print_file $files[$i];
    }
}

globdir @ARGV;

至少,它现在运行,并且做了一些接近你想要的东西。它还有很多问题。了解如何改进它,然后在此询问您是否需要任何进一步的帮助。


为了记录,我可能会解决这个问题:

#!/usr/bin/perl
use warnings;
use strict;

sub print_file {
  my $filename = shift;
  if (open my $fh, '<', $filename) {
    local $/;
    print <$fh>;
  }
}

sub globdir {
  foreach my $dir (@_) {
    foreach my $filename (glob "$dir/*") {
      print "Contents of file $filename:\n";
      print_file $filename;
      print "\n";
    }
  }
}

globdir @ARGV;

如果你仔细阅读并了解它与你的答案有何不同之处,那么你可能会学到很多东西。

答案 2 :(得分:0)

试试吧。这也是打印文件名及其内容。

use warnings;
use strict;
my $dir ='Direcotry_name';
opendir("dir",$dir); 
my @files = grep{m/.*\.txt/g} readdir("dir");  
foreach (@files){
    print "Filename is: $_";
    open("file","$dir/$_");
    my @ar = <file>;
    print "@ar";
}

在此代码行4中,regexp m/.*\.txt/将特定格式文件放入目录中。