构造`<data>`,`chomp`和`shift`在这个文件读取函数中做了什么?</data>

时间:2012-01-23 16:45:13

标签: perl

我正在使用现有的函数来读取文件。

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;,它会做什么?

3 个答案:

答案 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;”,它做了什么?

http://perldoc.perl.org/functions/chomp.html

答案 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($ _)

一样