【发布时间】:2015-06-06 15:25:15
【问题描述】:
一直在玩下面的脚本,但仍然无法理解这两种不同“种类”的文件句柄形式背后的含义。任何见解都将不胜感激。
#! usr/bin/perl
use warnings;
use strict;
open (FH, "example.txt") or die $!;
while (<FH>) {
my @line = split (/\t/, $_); {
print "@line","\n";
}
}
输出如预期:@line 数组包含来自example.txt 的第 1,2,3 行的元素...。有人告诉我 open (FH, example.txt) 不如 open (my $fh, '<', 'example.txt') 好,我更改了它,但随后出现了混乱。
根据我的发现,$fh 是scalar 并包含example.txt 中的所有信息。当我将一个数组分配给$fh 时,该数组将example.txt 中的每一行存储为数组中的一个组件。但是,当我尝试将组件进一步拆分为“更多组件”时,我收到了错误/警告消息“use of uninitialized value”。下面是显示错误/警告消息的实际脚本。
open (my $fh, '<', 'example.txt') or die $!;
foreach ($fh) {
my @line = <$fh>;
my $count = 0;
for $count (0..$#line) {
my @line2 = split /\t/, $line[$count];
print "@line2";
print "$line2[0]";
}
}
print "@line2" 显示预期的输出,但print "$line2[0]" 调用错误/警告消息。我想如果@line2 是一个真正的数组,$line2[0] 应该没问题。但是为什么是“未初始化的值”??
任何帮助将不胜感激。非常感谢。
添加 - 以下是“实际”脚本(我重新运行它并且警告在那里)
#! usr/bin/perl
use warnings;
use strict;
open (my $fh, '<', 'example.txt') or die $!;
foreach ($fh) {
my @line = <$fh>;
print "$line[1]";
my $count = 0;
for my $count (0..$#line) {
my @line2 = split /\t/, $line[$count];
print "@line2";
#my $line2_count = $#line2;
#print $line2_count;
print "$line2[3]";
}
}
警告仍然是use of uninitialized value $line2[3] in string at filename.pl line 15, <$fh> line3。
【问题讨论】:
-
你确定吗?我能够毫无问题地运行相同的代码。
-
使用 foreach 的第二个示例没有任何意义,并且存在您的问题,而不是打开三个 args。 while() .. 以与 globtype 相同的方式从文件句柄标量中读取数据。
-
@Сухой27,
foreach ($fh) { }毫无意义,只是因为它什么也没做。除了可读性之外,它不会造成任何损害。 -
@B Chen,如果
$line[$count]是一个空字符串,那么您可以获得该警告的唯一方法,但这是不可能的。它至少包含一个换行符。您发布的代码没有产生您声称的错误。请发布实际产生警告的代码以及必要的数据。
标签: arrays perl filehandle