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::CSV的getline函数并不会把结果自动放到Perl的默认变量$_里,你代码里是显式地把getline的返回值赋值给了$row变量,所以@$row和$_没有任何关系。如果想用$_承接返回值,你得手动写类似while ($_ = $csv->getline($fh))这样的代码才行。
内容的提问来源于stack exchange,提问作者capser




