【问题标题】:Perl - Data::Dumper array - start indexing at 0Perl - Data::Dumper 数组 - 从 0 开始索引
【发布时间】:2013-10-14 13:20:57
【问题描述】:

当您转储数组时:

use Data::Dumper;
@arr=('a','b','c');
print Dumper @arr;

你会得到这样的东西:

$VAR1 = 'a';
$VAR2 = 'b';
$VAR3 = 'c';

有可能得到这样的东西:

$VAR0 = 'a';
$VAR1 = 'b';
$VAR2 = 'c';

编辑:

到目前为止,我已经完成了这个单行:

perl -lane 'if ($_=~/VAR([0-9]+) = (.*)/) {print "VAR" . ($1-1) . "=" . $2} else {print $_}'

它用作后处理脚本,在 VAR 之后减少数字。但是正如你所看到的,当你有这样的元素时它不会产生正确的输出:

VAR7=$VAR2->[1];

我可以以某种方式扩展这个单行吗?

【问题讨论】:

  • 为什么要以0 开头?您不是在尝试解析 Dumper 输出吗?因为那确实是一个非常糟糕的主意。当使用Dumper() 打印一个数组时,您应该向它发送一个引用,如下所示:print Dumper \@arr
  • 不,我不想解析 Dumper 输出,我想要的只是在输出中设置数组索引,就像在 perl 中一样(数组的第一个元素从零开始)
  • @WakanTanka 变量的名称几乎无关紧要,索引只是为了美观。如果这就是你想要它的原因:当$arr[0]$VAR0 时你喜欢它,因为它更容易阅读(或其他东西),那很好。如果出于任何其他原因,您不应该这样做。无论你想出什么,它都将是脆弱和多余的。
  • 你为什么要编写一个 Perl 脚本来对另一个 Perl 脚本的输出进行后处理?如果您使用Data::Dumper 只是为了打印漂亮的数组,您可以通过简单的for 循环和single 脚本轻松获得相同的功能。
  • print "\$VAR$_ = '$arr[$_]';\n" for 0..$#arr

标签: arrays perl indexing data-dumper


【解决方案1】:

Dump 方法采用可选的第二个数组 ref,您可以在其中指定输出中所需的变量名称:

my @arr   = ('a', 'b', [qw(d e f)]);
my @names = map "VAR$_", 0 .. $#arr;

print Data::Dumper->Dump(\@arr, \@names);

输出:

$VAR0 = 'a';
$VAR1 = 'b';
$VAR2 = [
  'd',
  'e',
  'f'
];

您还可以查看Data::Printer。没用过,不过好像更偏向于数据结构的可视化展示。

【讨论】:

  • 这就是我要找的。谢谢。
  • @WakanTanka 对于嵌套数组,您的问题(顶级变量命名方案)中提出的问题有点无关紧要。对于内部数组,输出将显示为没有名称或索引编号。有关示例,请参见编辑后的答案。
  • @WakanTanka 我不知道。 Data::Dumper 很棒,但它并不是一个真正旨在支持在其输出表示中进行细粒度定制的工具。您要解决的根本问题是什么?对于这个问题,也许有比Data::Dumper 更好的工具。
  • @WakanTanka 不,这不是根本问题;您还试图通过将编号从 1 开始/对内部元素进行索引来做其他事情;那还有什么?
  • 我只想要一个可以轻松显示各种数据结构以进行调试的工具。 Data::Dumper 看起来不错(它可以显示各种嵌套数组(树)、哈希等),但我可以想象它可以以某种方式调整和自定义它的输出。或者,也许我正在寻找快速、轻松的错误搜寻最佳实践。
【解决方案2】:

无论您想用 $VARx 做什么,这都不是一个好主意。直接转储\@arr 而不是@arr 怎么样?

use Data::Dumper;
@arr=('a','b','c');
print Dumper \@arr;

制作:

$VAR1 = [
          'a',
          'b',
          'c'
        ];

【讨论】:

  • 当您打印参考资料时,您会丢失“索引”,整个尝试都是无用的。
  • 不,你没有;索引为$VAR1->[0] 等。无论您试图通过使用特定的 VARx 数字来完成什么,都有更好的方法。
  • 但我希望能够可视化结构(及其索引),而不仅仅是访问它们。当然,我可以使用$VAR1->[0],但是当我从 Data::Dumper 获得您提供的格式的输出时,这对我有什么帮助?想象一下,你有像 AoAoAoH 这样的复杂结构......并且你想知道你的代码哪里出错了,你不想一个一个地计算索引来看看会发生什么。我想要的只是看看结构并能够告诉:$arr->[2]->[4]->[5]->{'key1'} 中的索引值不是我想要的,让我们在这个变量发生变化的地方设置一些断点
【解决方案3】:

您可以尝试一些选项(请参阅:http://perldoc.perl.org/Data/Dumper.html

#!/usr/bin/perl
use warnings;
use strict; 
use Data::Dumper;
$Data::Dumper::Terse = 1; # This will print out just your output (in structure)
$Data::Dumper::Pad  = 'YOUR-PREFIX = '; # This prefixes your output with whatever you want

my @arr=('a','b','c');

print Dumper @arr;

输出:

YOUR-PREFIX = 'a'
YOUR-PREFIX = 'b'
YOUR-PREFIX = 'c'

【讨论】:

  • 是的,我在这里找到了类似的东西:stackoverflow.com/questions/908741/…,但这不是我想要的。
  • 我不确定您是否可以/为什么要这样做。也许你可以在你的问题中提供一些背景信息,让人们更好地了解你想要做什么......
  • 因为在我看来更自然的是让输出呈现数组,因为它从索引 0 而不是索引 1 开始
  • 如果这只是个人风格的事情,那么我看不出重点,因为您应该向 Dumper 发送参考以输出:$VAR1 = [ 'a', 'b', 'c' ];
  • @WakanTanka 使用 Data::Dumper 模块表示数组的自然方式是 FlyingFrog 上面所做的方式:$VAR1 = [ 'a', 'b', 'c' ]。当您执行print Dumper \@arr 时,您会得到什么。标量变量的名称是无关紧要的,除了人类可读的目的。
【解决方案4】:

我有与问题类似的需求 - 我有一个固定数组的传入数据,并想知道是否引用了正确的索引。从最初的问题来看,关于内部数组的部分似乎没有得到回答,因此也许这会对某人有所帮助。

对于内部数组,我不知道在树中执行此操作的方法,但对于单个数组,只需取消引用它:

print Dumper(@{$hash->{stuff}->{fields}});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2020-09-20
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多