我正在使用现有的函数来读取文件。
sub testRead {
my $file = shift;
open(DATA, "$file") || die "Can not open $file: $!";
my $title = <DATA>;
chomp($title);
my @names = split(/\t/, $title);
shift(@names);
my @data = ();
my $row = 0;
while(<DATA>) {
chomp;
my @line = split(/\t/);
for my $i (1 .. $#line) {
$data[$i-1][$row] = $line[$i];
}
$row ++;
}
close DATA;
return (\@data, \@names);
}
我通常可以理解这个功能是做什么的,但我对my $title = <DATA>;
不太确定。我知道<DATA>
表示文件句柄,但这行代码到底要做什么?此外,chomp($title);
和shift(@names);
的目标是什么?此外,在while(<DATA>)
循环中,只有一行代码chomp;
,它会做什么?
答案 0 :(得分:6)
但我不太确定以下几行代码:
my $title = <DATA>;
我知道代表文件处理程序,但这行代码到底要做什么?
http://perldoc.perl.org/perlop.html#I/O-Operators
此外,chomp($ title);并转移(@names);旨在发挥作用?
http://perldoc.perl.org/functions/chomp.html
http://perldoc.perl.org/functions/shift.html
此外,在while循环中(“,有一行代码 “chomp;”,它做了什么?
答案 1 :(得分:1)
文件读取运算符在此处用于标量上下文。
my $title = <DATA>;
从DATA
读取一行到$title
。循环:
while (<DATA>) {
...
}
将一直运行直到文件结束,将当前读取的行存储在$_
。
chomp
将修改作为参数传递的变量(它不返回修剪过的字符串),这意味着它会切断所有空格换行符(或在字符串末尾的$/
)中的任何内容。
与大多数期望单个参数的函数一样,如果在没有参数的情况下调用了相关函数(因此循环中只有$_
),将使用chomp
。
接下来,使用制表符\t
作为标记分隔符将现在裁剪的字符串拆分为数组。在得到的数组中,第一个使用shift
被丢弃。这是注释的脚本:
my $title = <DATA>;
# $title is now: Foo\tBar\tZoid\n
chomp($title);
# $title is now: Foo\tBar\tZoid
my @names = split /\t/, $title;
# @names is now: "Foo", "Bar", "Zoid"
shift @names;
# @names is now: "Bar", "Zoid"
答案 2 :(得分:1)
my $title = <DATA>;
DATA文件句柄是一种在源代码文件中包含文件内容的方法(参见perldata.pod)。
在你的代码中,你的代码有__DATA__或__END__标记,后面是行 每次从DATA文件句柄中读取时都会返回这些标记。
因此,上面的代码读取__DATA__标记之后的第一行并将其分配给$ title。
chomp($title);
从$ title的末尾删除换行符(如果有的话)。
shift(@names);
从@names中删除第一个元素,然后丢弃它。
chomp()没有参数chomp $ _就像你写了chomp($ _)
一样