下面提到的是在执行时抛出以下错误 - :
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;
答案 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_file
和globdir
两个函数中使用它。为此,您需要输入:
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/
将特定格式文件放入目录中。