【问题标题】:What do the square brackets signify in following push syntax in Perl?Perl 中的以下推式语法中的方括号表示什么?
【发布时间】:2010-11-10 12:12:06
【问题描述】:

我在阅读脚本时遇到了这种语法。我不确定方括号的用途是什么。

push @data, [ split //, $line ]; #printing this array gives crap values

或者说上面和下面有什么区别?

push @data, (split//, $line); #printing this gives actual values

有什么建议吗?

【问题讨论】:

  • 你所说的废话不是这样的。使用Data::Dumper 打印出复杂的数据结构。
  • 除了perldoc perlreftut,查看perldoc perllolperldoc perldsc 了解更多关于参考的信息——如何制作和使用它们。

标签: perl arrays reference


【解决方案1】:

代码:

push @data, (split//, $line);

将当前行的所有项目推入@data

push @data, [split //, $line]; 

将包含这些项目的匿名数组的引用推送到@data

如果您只处理 '$line' 的一个值,则使用前者可能更有效*1,但是,如果您正在处理包含多行的文件并且您想要要区分内容所在的行,后者更有效。

考虑:

my @data; 
while( my $line = <$fh> ){
  push @data , ( split //,  $line ); 
}
use Data::Dumper; 
$Data::Dumper::Indent = 0; 
$Data::Dumper::Terse = 1;
print Dumper( \@data ); 

这将产生作为单独字符读入的所有字节,单个 包含它们的数组,即:

[ "a", "b" , "c" , "\n", "d", "e", "f" ]

当这反而会做一些完全不同的事情时:

my @data; 
while( my $line = <$fh> ){
  push @data , [ split //,  $line ]; 
}
use Data::Dumper; 
$Data::Dumper::Indent = 0; 
$Data::Dumper::Terse = 1;
print Dumper( \@data ); 

并且会像这样对行进行分组:

[ [ "a", "b", "c" , "\n" ], [ "d" , "e", "f" , "\n" ] ]

因此您以后可以更轻松地以编程方式遍历它。

注意:

 push @data, ( split  //, $line ); 

  push @data, split //, $line; 

是等价的。

还有,

my @other  = ( 1,2,3 );
push @data, @other ;

push @data, 1,2,3; 

是等价的。

来自perldoc -f push

推数组,列表 将 ARRAY 视为堆栈,并将 LIST 的值推送到 ARRAY 的末尾。 ARRAY 的长度增加了 LIST 的长度。具有相同的效果 对于 $ 值(列表){ $阵列[++$#阵列] = $值; } 但效率更高。返回完成的“推送”之后数组中的元素数。

*1:实际上,tbf,任何有半脑的人都可能想要@data = split //, $line

【讨论】:

  • 说得好:能够稍后到达特定行是关键。如果你需要,你需要参考。
  • @kent:谢谢!使用示例来解释这两种情况有助于理解这个概念。
  • @Kent +1,感谢您在阅读 OP 文档方面做得如此出色。顺便说一句,任何对 Perl 感兴趣的人都应该知道[ ... ] 是什么...stackoverflow.com/questions/1114522/… 在上下文中显示了有问题的代码。
  • @Sinan:没有人天生就知道[],值得记住的是,在Learning Perl 中从未提及引用。我并不是说引用对于认真对待 Perl 的人来说并不重要,但我怀疑大量脚本或仅维护 Perl 编码人员很少使用引用。
【解决方案2】:

这是来自我的answers之一:

push @data, [ split //, $line ];

@data 是一个数组引用数组。 @data 的每个元素都是对匿名数组的引用,该数组的条目是$line 中的字符。

另见perldoc perlreftut

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2017-05-04
    • 2014-09-30
    • 1970-01-01
    • 2012-04-05
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多