【问题标题】:How can I keep the referent from changing when the underlying data is modified? [duplicate]当基础数据被修改时,如何防止引用对象发生变化? [复制]
【发布时间】:2018-06-19 03:57:01
【问题描述】:

脚本1

use strict;
use Data::Dumper;
use Getopt::Long qw(GetOptions);

my @results;
my @result1 = ('Chemisty', '87');
my @result2 = ('French', '80');

my $results_len = scalar @results;
print "============   results [$results_len] ==========================\n";
print Dumper(\@results);
print "==========================**\n";

#
push @results, \@result1;
$results_len = scalar @results;
print "============   results [$results_len] ==========================\n";
print Dumper(\@results);
print "==========================**\n";

#
push @results, \@result2;
$results_len = scalar @results;
print "============   results [$results_len] ==========================\n";
print Dumper(\@results);
print "==========================**\n";

Script2

use strict;
use Data::Dumper;
use Getopt::Long qw(GetOptions);

my @results;
my @result1 = ('Chemisty', '87');

my $results_len = scalar @results;
print "============   results [$results_len] ==========================\n";
print Dumper(\@results);
print "==========================**\n";

#
push @results, \@result1;
$results_len = scalar @results;
print "============   results [$results_len] ==========================\n";
print Dumper(\@results);
print "==========================**\n";

@result1 = ('French', '80');

#
push @results, \@result1;
$results_len = scalar @results;
print "============   results [$results_len] ==========================\n";
print Dumper(\@results);
print "==========================**\n";

在 script2 中...我应该如何清除 result1 以便我可以再次重用它并像在 script1 中一样获得输出?

我尝试了undef,将其设置为空白...如果我再次使用“我的结果1”再次重置它,但这会标记警告

【问题讨论】:

  • "get the output like in script1" - 您是否希望这里的每个人都将您的代码复制/粘贴到文件中并运行它?为什么不在这里发布输出,让每个人都知道你在说什么?
  • 让每个段落都成为函数调用? addToResults(\@results, 'Chemisty', '87')
  • 理想情况下,执行两次mymy @row1 = ('Chemisty', '87'); my @row2 = ('French', '80'); my @results = ( \@row1, \@row2 );while ( my @row = get() ) { push @results, \@row; }),但如果您有重复使用相同数组的异常代码,您也可以复制该数组(push @results, [ @row ];

标签: perl


【解决方案1】:

push @foo, \@bar 将对命名数组@bar 的引用添加到数组@foo。如果@bar的内容稍后更新,那么也会影响@foo的内容。

当您预计@bar 将被更新时,一种解决方法是将对@bar 的当前副本 的引用推送到@foo。这可以通过[ @bar ] 语法来完成,该语法创建一个由@bar 初始化的新数组引用。

@bar = ( ... );
push @foo, [ @bar ];
@bar = ( ... ); # something else
push @foo, [ @bar ];
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多