You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Perl中Text::CSV模块@$row变量类型及与getline关系问询

关于Perl代码中@$row的疑问解答

先把你提供的代码贴出来方便对照:

#!/efs/dist/perl5/core/5.10/exec/bin/perl
use Text::CSV;
use Time::Local ;
use strict;
use warnings;
my $file = "$ARGV[0]";
open my $fh, "<", $file or die "$file: $!" ;
my $csv = Text::CSV->new( { binary => 1, auto_diag => 1, } );
while ( my $row = $csv->getline($fh) ) {
print "@$row\n" ; # Line 18
}

让我逐个帮你拆解这些问题:

1. 代码第18行的@$row是什么?

@$row是Perl里的数组解引用操作。因为$csv->getline($fh)返回的是一个数组引用(可以理解成指向数组的一个“指针”),这个引用被存在标量变量$row里。用@$row就能把这个引用指向的实际数组“展开”成普通的数组列表,这样print的时候就会把数组里的每个元素用空格分隔后输出。

2. 它属于哪种变量?

严格来说,@$row本身不是一个独立的变量,它是对**标量变量$row**的解引用操作——$row是标量类型,因为Perl里所有的引用都归为标量范畴。解引用后得到的是一个数组列表,你可以把它当成普通数组来使用(比如遍历、取单个元素等)。

3. 它是否是Text::CSV模块getline函数的默认输出$_?

完全不是。Text::CSVgetline函数并不会把结果自动放到Perl的默认变量$_里,你代码里是显式地把getline的返回值赋值给了$row变量,所以@$row$_没有任何关系。如果想用$_承接返回值,你得手动写类似while ($_ = $csv->getline($fh))这样的代码才行。

内容的提问来源于stack exchange,提问作者capser

火山引擎 最新活动