显然,我对无自动修复实用程序的理解是不完美的,因为以下脚本的非线性 19行为对我来说是非常令人惊讶的.
use 5.014;
use strict;
use warnings;
no autovivification qw(fetch exists delete warn);
{
my $foo = undef;
my $thing = $foo->{bar};
# this does not die, as expected
die if defined $foo;
}
{
my $foo = undef;
do_nothing( $foo->{bar} );
# I would expect this to die, but it doesn't
die unless defined $foo;
}
sub do_nothing {
return undef;
}
Run Code Online (Sandbox Code Playgroud)
运行脚本会产生:
Reference was vivified at test.pl line 8.
Run Code Online (Sandbox Code Playgroud)
问题:为什么$foo在$foo->{bar}作为sub的参数提供时自动生成,即使 …
这个问题是关于在Python中实现完整的Perl自动修改.我知道之前提出过类似的问题,到目前为止,最好的答案是" 在Python中实现嵌套字典的最佳方法是什么? ".但是,我希望这样做:
a['x']['y'].append('z')
Run Code Online (Sandbox Code Playgroud)
没有a['x']['y'] = []首先声明,或者更确切地说,没有声明a['x'] = {}.(在Perl中你可以注意到push @{$a->{x}{y}}, 'z';.)
我知道dict和list类sorta不混合,所以这很难,但我有兴趣看看是否有人有一个巧妙的解决方案,可能涉及从中创建一个继承的类,dict但append在其上定义了一个新的方法?
我也知道这可能会让一些Python纯粹主义者想要我坚持使用Perl.但是,即使只是为了挑战,我也希望看到一些东西.
perl -Mstrict -wlE 'my %h; say grep 0, $h{poluted}; say keys %h'
Run Code Online (Sandbox Code Playgroud)
产量
poluted
Run Code Online (Sandbox Code Playgroud)
和
perl -Mstrict -wlE 'my %h; say grep 0, my @r= $h{poluted}; say keys %h'
Run Code Online (Sandbox Code Playgroud)
没有输出.
我想知道为什么输出有所不同?
更新:我对此问题的初衷是确定PHP是否确实具有此功能.在答案关注标量问题时,这已经失去了.请改为查看这个新问题:"PHP是否具有自动生成功能?" 这个问题留待这里参考.
根据维基百科,PHP没有自动更新,但此代码有效:
$test['a']['b'] = 1;
$test['a']['c'] = 1;
$test['b']['b'] = 1;
$test['b']['c'] = 1;
var_dump($test);
Run Code Online (Sandbox Code Playgroud)
输出:
array
'a' =>
array
'b' => int 1
'c' => int 1
'b' =>
array
'b' => int 1
'c' => int 1
Run Code Online (Sandbox Code Playgroud)
我发现这段代码也有效:
$test['a'][4] = 1;
$test['b'][4]['f'] = 3;
Run Code Online (Sandbox Code Playgroud)
但添加此行会引发警告("警告:不能将标量值用作数组")
$test['a'][4]['f'] = 3;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么在索引后添加关联元素时它会失败?这是'真正的'Perl式自动更新,还是其中的一些变体,还是其他什么?
编辑:哦,我现在看到标量的错误,哎呀!这些按预期工作:
$test['a'][4]['a'] = 1;
$test['a'][4]['b'] = 2;
$test['a'][5]['c'] = 3;
$test['a'][8]['d'] = 4;
Run Code Online (Sandbox Code Playgroud)
那么,php确实有autovivification?在Google上搜索"php autovivification"并没有提出一个规范的答案或例子.
假设你有一个巨大的应用程序"开发";)由一个大团队.以下是当某人检查数据结构太深时可能发生的潜在灾难的简化模型.如果无法完全或在范围内禁用自动验证,如何解决此问题?非常感谢你 :) !!!!
use strict; use warnings;use Data::Dumper;
my $some_ref = {akey=>{deeper=>1}};
print Dumper($some_ref );
if($some_ref->{deep}{doot} == 1){
print 'too deep '.$/;
}
if($some_ref->{deep}){
print 'Already in a deep doot'.$/;
}
print Dumper($some_ref );
Run Code Online (Sandbox Code Playgroud)
这输出如下:
$VAR1 = {
'akey' => {
'deeper' => 1
}
};
Use of uninitialized value in numeric eq (==) at autovivify_test.pl line 5.
Already in a deep doot
$VAR1 = {
'deep' => {},
'akey' => {
'deeper' => 1
}
};
Run Code Online (Sandbox Code Playgroud)
是的,我知道有警告,但......可能为时已晚.
嘿伙计们,我的hashref引用一个绑定的HASH可能会有所帮助.
可能如果我实现了一个好的FETCH方法来检查结构中更深层次的检查,我会轻易解决我的问题吗? …
这是我发现的一个微妙之处keys().
$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my @e = keys(%{$d->{cd}});'
$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my %e = %{$d->{cd}};'
Can't use an undefined value as a HASH reference at -e line 1.
Run Code Online (Sandbox Code Playgroud)
我最困惑的是为什么第一个片段不会给出解除引用错误.当我使用时Data::Dumper,很明显在第一个片段中$d->{cd},被自动化了{}.
为什么keys需要自动生成?我试着读perldoc它,找不到令人满意的答案.keys没有设置别名($_等)所以不需要perl认为$d->{cd}需要在左值上下文中,是吗?(我的理解,如果表达式需要在左值方面偏偏自动激活作为解释在这里.
相关帖子.
我正在尝试使用以下模块关闭自动激活:https ://metacpan.org/pod/autovivification但 grep 失败:
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':all';
use DDP;
no autovivification;
my %h = (
'a' => 1,
'b' => 2,
);
p %h; # pretty print the original hash
my @fake_keys = ('x', 'y', 'z');
if (grep {defined} @h{@fake_keys}) {
say "found fake keys";
}
p %h; # show that 'x', 'y', & 'z' are added as undef keys
Run Code Online (Sandbox Code Playgroud)
如何关闭grep的自动激活?
我们正在将 PHP 升级到版本 8.1。使用 MS Sql Server 数据库。一切似乎都正常工作,但我在日志文件中看到重复的消息:
[03-Feb-2022 11:51:18 America/New_York] PHP 已弃用:C:...\includes\adodb\drivers\adodb-mssqlnative.inc.php 第 154 行中已弃用 false 到数组的自动转换
我已将 adodb 更新到版本 5.22,但这并没有阻止消息记录。ini文件有
extension=php_sqlsrv_81_nts_x64.dll
extension=php_pdo_sqlsrv_81_nts_x64.dll
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?
无论如何,无论是本地还是通过库,在Javascript对象上使用自动生成?
IE,假设foo是一个没有属性的对象,能够做foo.bar.baz = 5而不是需要foo.bar = {}; foo.bar.baz = 5.
TL; DR
在为子键分配值时,如何在Python dict中使超级密钥自动生成,而不检查子键时是否自动生成它们?
背景: 通常在Python中,在嵌套字典中设置值需要在分配给子键之前手动确保存在更高级别的键.那是,
my_dict[1][2] = 3
Run Code Online (Sandbox Code Playgroud)
如果没有先做类似的事情,将不会按预期可靠地工作
if 1 not in my_dict:
my_dict[1] = {}
Run Code Online (Sandbox Code Playgroud)
现在,可以通过创建my_dict覆盖类的实例来设置一种自动生成,__missing__例如在/sf/answers/1388080011/中所示.
问题:但是,如果您在这样的嵌套字典中检查是否存在子键,那么该解决方案会自动对高级别密钥进行自动生成.这导致以下不幸:
>>> vd = Vividict()
>>> 1 in vd
False
>>> 2 in vd[1]
False
>>> 1 in vd
True
Run Code Online (Sandbox Code Playgroud)
我怎样才能避免这种误导性的结果呢?顺便说一句,在Perl中,我可以通过这样做获得所需的行为
no autovivification qw/exists/;
Run Code Online (Sandbox Code Playgroud)
基本上我想在可能的情况下在Python中复制该行为.
autovivification ×10
perl ×5
php ×2
python ×2
adodb-php ×1
dereference ×1
dictionary ×1
hash ×1
javascript ×1
key ×1
object ×1
php-8.1 ×1
sql-server ×1