- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
G'Day,
我目前正致力于从许多较小的散列中创建大散列。假设这些较小的散列分别定义在一个文件中,然后可以包含在较大的散列中。
例如,让我们看看一些小的哈希值
文件 personcontact.pl
:
return {
\'firstname\' => {
\'__type\' => \'String\'
},
\'lastname\' => {
\'__type\' => \'String\'
},
%{include("/tmp/address.pl")}
}
address.pl
:
return {
\'address\' => {
\'street\' => {
\'__type\' => \'String\'
},
\'unit\' => {
\'__type\' => \'String\',
\'__validation_function\' => {
\'is_a_number\' => \'\'
},
\'__schema_constraints\' => {
\'is_not_null\' => \'\'
}
},
\'suburb\' => {
\'__type\' => \'String\'
},
\'__type\' => \'ARRAY\'
}
}
include
子程序,看起来像这样:
sub include {
my ($filename) = @_;
my $file;
open(my $fh, "<", $filename) or die ("FILEOPEN: $!");
while(my $line = <$fh>) { $file .= $line; }
my $result = eval $file;
die("EVAL: $@") if $@;
close($fh) or die("FILECLOSE: $!");
return $result;
}
Useless use of a variable in void context at (eval 11) line 4, <SCHEMAFILE> line 6
的错误消息或
Odd number of elements in anonymous hash at (eval 11) line 5, <SCHEMAFILE> line 6
.我不知道如何去寻找(eval 11)第 4-3 行,第 6 行。任何关于使用 Perl 调试器的建议或任何关于我可能出错的地方的指示都将不胜感激。
最佳答案
欢迎使用 Perl。我希望你有一个愉快的学习和使用它。
做生意,从哪里开始?我在这里有很多话要说。
首先,通过评估文件加载数据存在不必要的风险。如果您只想序列化数据,请尝试 JSON::XS或 YAML ,甚至 Storable .如果你想要一个配置文件,CPAN 上有很多模块可以帮助完成这个任务。退房 Config::Any .
如果你想创建数据结构以通过 eval 加载(这不是一个好主意),Data::Dumper生成创建您提供给它的任何数据结构所需的 perl 代码。我提到它的主要原因是它作为调试辅助工具比序列化程序更有用。
既然已经解决了这个问题,如果你想加载一个文件并对其进行评估(同样,在几乎所有情况下都不是最好的主意),你应该查看 do或 require .
my $stuff = do 'address.pl';
eval
是一种通常最好不要使用的工具。 99% 的情况下,如果您打算使用字符串 eval,请停下来想其他方法来解决问题。 Do 是一个隐式的 eval,所以它也很重要。
=>
或胖逗号自动引用其左侧(LHS),就好像它只是字母数字一样。但是把所有的引号和转义符都放在一起会让事情变得很狡猾。
\'address\' => {}
, Perl 将其视为
\
,应用于字符串文字的“获取引用”运算符。在这种情况下,是未终止的字符串文字,因为您从不提供未转义的
'
第一次之后。
'address'
,引号和所有作为您的哈希键,您可以这样做:
my %foo = ( "'address'" => 'blah' );
my %foo = ( address => 'blah' );
splain
的脚本。 :一个方便的花花公子工具,它将更详细地解释错误消息。您也可以使用
diagnostics模块以自动获取相同的扩展错误消息。
#!/usr/bin/perl
use JSON::XS;
use File::Spec;
use constant BASEDIR => '.';
# Key is the file name, value is the data to put into the file.
my %schemata = (
'address.json' => {
address => {
street => { __type => 'String' },
unit => {
__type => 'String',
__validation_function => { is_a_number => '' },
__schema_constraints => { is_not_null => '' }
},
suburb => { __type => 'String' },
__type => 'ARRAY'
},
},
'person_contact.json' => {
firstname => { __type => 'String' },
lastname => { __type => 'String' },
# Use a special key to indicate that additional files should be
# loaded into this hash.
INCLUDE => [qw( address.json )],
},
# And so forth
);
for my $schema ( keys %schemata ) {
my $path = File::Spec->catfile( BASEDIR, $schema );
open my $fh, '>', $path
or die "Error opening '$path' for writing - $!\n";
print $fh encode_json $schemata{$schema};
}
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use JSON::XS;
use File::Spec;
use constant BASEDIR => '.';
my $schema = load_schema( 'person_contact.json' );
print Dumper $schema;
sub load_schema {
my $file = shift;
my $path = File::Spec->catfile( BASEDIR, $file );
open my $fh, '<', $path
or die "Error opening file '$path' - $!\n";
my $json = join '', <$fh>; # reads a list of lines and cats them into one string.
# One way to slurp out of many.
my $schema = decode_json( $json );
# Handle the inclusion stuff:
if( exists $schema->{INCLUDE} ) {
# Copy the files to load into an array.
my @loadme = @{$schema->{INCLUDE}};
# delete the magic special include key.
delete $schema->{INCLUDE};
# Load each file and copy it into the schema hash.
for my $load ( @loadme ) {
my $loaded = load_schema( $load );
# This is a bit of weird syntax.
# We are using a hash slice assignment to copy the loaded data into the existing hash.
# keys and values are guaranteed to come out in the same (random) order as each other.
# the @{$foo}{blahbhal} is how you dereference a hash reference as a slice.
@{$schema}{keys %$loaded} = values %$loaded;
}
}
return $schema;
}
关于perl - 在 Perl 中的散列中包含散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4778649/
我有一个类似于以下的结构。 class A { string title; List bItem; } class B { int pric
本地流 和 远程流 两者都是“媒体流列表 ”。 本地流 包含“本地媒体流 ” 对象 但是,远程流 包含“媒体流 ” 对象 为什么差别这么大? 当我使用“本地流 “- 这个对我有用: localVide
我正在尝试将 8 列虚拟变量转换为 8 级排名的一列。 我试图用这个公式来做到这一点: =IF(OR(A1="1");"1";IF(OR(B1="1");"2";IF(OR(C1="1");"3";I
我正在使用面向对象编程在 Python 中创建一个有点复杂的棋盘游戏的实现。 我的问题是,许多这些对象应该能够与其他对象交互,即使它们不包含在其中。 例如Game是一个对象,其中包含PointTrac
有没有办法获取与 contains 语句匹配的最深元素? 基本上,如果我有嵌套的 div,我想要最后一个元素而不是父元素: Needle $("div:contains('Needle')")
出于某种原因,我无法在 Google 上找到答案!但是使用 SQL contains 函数我怎么能告诉它从字符串的开头开始,即我正在寻找等同于的全文 喜欢 'some_term%'。 我知道我可以使用
我正在尝试创建一个正则表达式来匹配具有 3 个或更多元音的字符串。 我试过这个: [aeiou]{3,} 但它仅在元音按顺序排列时才有效。有什么建议吗? 例如: 塞缪尔 -> 有效 琼 -> 无效 S
嘿所以我遇到了这样的情况,我从数据库中拉回一个客户,并通过包含的方式包含所有案例研究 return (from c in db.Clients.Include("CaseStudies")
如果关键字是子字符串,我无法弄清楚为什么这个函数不返回结果。 const string = 'cake'; const substring = 'cak'; console.log(string.in
我正在尝试将包含特定文本字符串的任何元素更改为红色。在我的示例中,我可以将子元素变为蓝色,但是我编写“替换我”行的方式有些不正确;红色不会发生变化。我注意到“contains”方法通常写为 :cont
我想问一下我是否可以要求/包含一个语法错误的文件,如果不能,则require/include返回一个值,这样我就知道所需/包含的文件存在语法错误并且不能被要求/包含? file.php语法错误 inc
我想为所有包含youtube链接的链接添加一个rel。 这就是我正在使用的东西-但它没有用。有任何想法吗? $('a [href:contains(“youtube.com”)]')。attr('re
我正在尝试在 Elasticsearch 中查询。除搜索中出现“/”外,此功能均正常运行。查询如下所示 GET styling_rules/product_line_filters/_search {
我正在开发名为eBookRepository的ASP.NET MVC应用程序,其中包含在线图书。 电子书具有自己的标题,作者等。因此,现在我正在尝试实现搜索机制。我必须使用Elasticsearch作
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
我的问题是我可以给出条件[ 'BookTitleMaster.id' => $xtitid, ] 如下所示 $bbookinfs = $this->BookStockin->BookIssue->fi
我需要能够使用 | 检查模式在他们中。例如,对于像“dtest|test”这样的字符串,像 d*|*t 这样的表达式应该返回 true。 我不是正则表达式英雄,所以我只是尝试了一些事情,例如: Reg
我想创建一个正则表达式来不匹配某些单词... 我的字符:var test = "é123rr;and;ià456;or;456543" 我的正则表达式:test.match(\((?!and)(?!o
我在 XSLT 中有一个名为 variable_name 的变量,如果相关产品具有名称为 A 或 B 或两者均为 A & 的属性,我将尝试将其设置为 1 B.
您好,我想让接待员和经理能够查看工作类型和费率并随后进行更新。但是技术人员只能查看不能更新。该图是否有效? 我读到扩展用例是由发起基本用例的参与者发起的。我应该如何区分技术人员只能启动基本案例而不能启
我是一名优秀的程序员,十分优秀!