Giả sử bạn có một ứng dụng HUGE "develoopped";) bởi một nhóm lớn. Đây là một mô hình đơn giản của thảm họa tiềm năng có thể xảy ra khi ai đó kiểm tra quá sâu trong cấu trúc dữ liệu. Nếu không thể tắt hoàn toàn tự động hoặc trong phạm vi, cách khắc phục sự cố này? Cảm ơn bạn rất nhiều :) !!!!Làm cách nào để tắt tính năng tự động hóa trong Perl?
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);
này kết quả đầu ra như sau:
$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
}
};
Có, tôi biết có một cảnh báo, nhưng ... nó có thể là quá muộn.
Xin chào các bạn, tôi có thể nói rằng hashref của tôi tham chiếu đến HASH bị ràng buộc.
Có thể nếu tôi triển khai phương pháp FETCH tốt để kiểm tra xem có sâu hơn trong cấu trúc không, tôi sẽ giải quyết dễ dàng vấn đề của tôi?
Tôi nhìn Tie::StrictHash, Tie::Hash và perltie. Đây là phiên bản đơn giản của giải pháp của tôi:
#!/usr/bin/env perl;
#test_tie.pl
package StrictHash;
use strict; use warnings;
use Tie::Hash;
our @ISA = qw(Tie::StdHash);
use Carp;
sub TIEHASH {
my $class = shift;
my $hash = bless {@_}, $class;
return $hash;
}
##========================================================================
## FETCH fails if applied to a member that doesn't exist.
##========================================================================
sub FETCH {
my ($hash, $key) = @_;
Carp::confess "key '$key' does not exist" unless exists $hash->{$key};
return $hash->{$key};
}
##========================================================================
package main;
use strict;use warnings;use Data::Dumper;
#Imagine StrictHash is in ./StrictHash.pm
#use StrictHash;
my %hash;
tie %hash, 'StrictHash', akey => {deeper=>1} ;
my $some_ref =\%hash;
print Dumper($some_ref);
if($some_ref->{deep}{doot} == 1){
print 'too deep '.$/;
}
Điều tôi đạt được chỉ là chạm vào một vị trí trong ứng dụng. Bây giờ tất cả các Địa điểm như nếu ($ some_ref -> {deep} {doot}) sẽ gây chết với stack-trace. Vì vậy, tôi sẽ dễ dàng tìm thấy chúng và sửa chúng. Và các tác phẩm mới của loại này sẽ KHÔNG thể thực hiện được. Perl cũng tốt cho các ứng dụng lớn, bạn chỉ cần biết nhiều hơn;).
Cảm ơn tất cả! Tôi hy vọng điều này cũng giúp người khác.
câu hỏi của bạn là gì? –
Làm cách nào để tắt tính năng tự động hóa trong perl? –