将文本文件读取到数组并访问元素

时间:2013-12-10 04:41:28

标签: perl

我正在尝试读取文本文件的每个记录,一次一行,并将其放入数组中。文本文件看起来像这样......

 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/sbin/nologin
 ETC

然后访问数组的特定元素,并使用if语句查看它是否满足某些要求。我的代码不会编译,它只是立即关闭,我卡住了,需要向正确的方向推进。这是我到目前为止所拥有的......

open (FILEHANDLE1, "text.old") || die "Can't open file named text.old: $!";

open (FILEHANDLE2, ">text.new") || die "Can't create file named text.new: $!\n";

while ($_ = <FILEHANDLE1>)
{
@array = split (/:/, <FILEHANDLE1>);
if ($array[2] eq "0")
    {
    print "$array[2] Superuser Account\n";
    }

close (FILEHANDLE2) || die "Can't close file named text.new: $!\n";

close (FILEHANDLE1) || die "Can't close the file named text.old: $!";

1 个答案:

答案 0 :(得分:3)

这个while循环没有右括号:

while ($_ = <FILEHANDLE1>)
{
@array = split (/:/, <FILEHANDLE1>);
if ($array[2] eq "0")
    {
    print "$array[2] Superuser Account\n";
    }

其次,你真的想把它写成:

while (<FILEHANDLE1>)
{
    chomp;
    my @array = split /:/;
    if ($array[2] eq "0")
    {
        print "$array[2] Superuser Account\n";
    }
}

chomp不是严格必要的,但它会避免您在解析密码文件的“shell”字段中挂起换行符时出现奇怪的结果,如果你最终需要处理shell。

最后一个风格建议,因为你还在学习perl:你应该尽量避免使用旧的两个参数 open,而是使用newer three argument open。也就是说,而不是:

open (FILEHANDLE2, ">text.new") || die "Can't create file named text.new: $!\n";

您应该使用三个参数形式:

open (FILEHANDLE2, ">", "text.new") || die "Can't create file named text.new: $!\n";

对于这个特殊的例子,它没有太大的区别。但是,当文件名到达变量时,三参数形式更安全。

你也可以考虑养成使用lexical filehandles.的习惯:

open my $filehandle1, "<", "text.old" or die "Can't open file named text.old: $!\n";
open my $filehandle2, ">", "text.new" or die "Can't create file named text.new: $!\n";

while (<$filehandle1>)
{
    chomp;
    my @array = split /:/;
    if ($array[2] eq "0")
    {
        print "$array[2] Superuser Account\n";
    }
}

close $filehandle2 or die "Can't close file named text.new: $!\n";
close $filehandle1 or die "Can't close the file named text.old: $!\n";

词法文件句柄的优点是它们在声明的任何范围内都保持在本地。例如,这使得在子例程中本地处理文件变得更加容易。

我注意到你还没有对第二个文件做任何事情。 (原始代码中的FILEHANDLE2。)我假设一旦你掌握了基础知识,代码就会出现。 : - )