我正在尝试读取文本文件的每个记录,一次一行,并将其放入数组中。文本文件看起来像这样......
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: $!";
答案 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
。)我假设一旦你掌握了基础知识,代码就会出现。 : - )