当前位置: 首页 > 知识库问答 >
问题:

perl 6“do(file)”等效项

酆鸿彩
2023-03-14

在perl5中,我曾经对配置文件进行“do(file)”,如下所示:

---script.pl start ---
our @conf = ();
do '/path/some_conf_file';
...
foreach $item (@conf) {
    $item->{rules} ...
...
---script.pl end ---

---/path/some_conf_file start ---
# arbitrary code to 'fill' @conf
@conf = (
{name => 'gateway',
    rules => [
        {verdict => 'allow', srcnet => 'gw', dstnet => 'lan2'}
    ]
},

{name => 'lan <-> lan2',
    rules => [
        {srcnet => 'lan', dstnet => 'lan2',
         verdict => 'allow', dstip => '192.168.5.0/24'}
    ]
},
);
---/path/some_conf_file end ---

另外Larry Wall的“Programming Perl”也提到了这个方法:

但是做FILE对于读取程序配置文件之类的事情仍然有用。手动错误检查可以通过以下方式完成:

# read in config files: system first, then user 
for $file ("/usr/share/proggie/defaults.rc",
                "$ENV{HOME}/.someprogrc") {
         unless ($return = do $file) {
             warn "couldn't parse $file: $@" if $@;
             warn "couldn't do $file: $!"    unless defined $return;
             warn "couldn't run $file"       unless $return;
         } }

优点:

  • 不需要每次都编写自己的解析器-perl解析并为您创建数据结构;
  • 更快/更简单:本机perl数据结构/类型,无需从外部格式(如YAML)转换开销;
  • 与作为conf文件的模块相比,不需要操纵@INC从某处加载模块;
  • 与conf文件的模块相比,额外的代码更少;
  • “配置文件”的“语法”与perl本身一样强大;
  • “ad hoc”格式;

弊:

  • 没有隔离:我们可以执行/销毁“配置文件”中的任何内容;

perl6如何获得相同的结果
在perl6中有没有更好的方法(没有缺点)并且不解析自己的语法、语法、模块包括
类似“从文件中的文本表示加载哈希或数组”之类的内容?

共有1个答案

赵骏奇
2023-03-14

您可以使用电子邮箱($file)(参考 http://doc.perl6.org/language/5to6-perlfunc#do)。

正如您指出的,使用EVALFILE有缺点,因此我不打算在这方面添加任何内容:-)

下面是一个示例配置文件:

# Sample configuration (my.conf)
{
    colour  => "yellow",
    pid     => $*PID,
    homedir => %*ENV<HOME> ~ "/.myscript",
    data_source => {
        driver => "postgres",
        dbname => "test",
        user   => "test_user",
    }
}

这是一个使用它的示例脚本:

use v6;

# Our configuration is in this file
my $config_file = "my.conf";
my %config := EVALFILE($config_file);

say "Hello, world!\n";

say "My homedir is %config<homedir>";
say "My favourite colour is %config<colour>";
say "My process ID is %config<pid>";
say "My database configuration is:";
say %config<data_source>;

if $*PID != %config<pid> {
    say "Strange. I'm not the same process that evaluated my configuration.";
}
else {
   say "BTW, I am still the same process after reading my own configuration.";
}
 类似资料:
  • 该程序创建一个线程,用dir()读取目录,并将文件放在通道上$N个工作线程读取该通道并“处理”(打印)文件。 然而,我得到了这个“等待的第一个操作:”错误。 关于这个错误,我已经在陷阱页面上读了好几遍了,但还是没有弄明白。能解释一下这里发生了什么吗? 目录内容: 运行程序: 程序travers-dir. p6:

  • 问题内容: How do I change the file creation date of a Windows file from Python? 问题答案: Yak shaving for the win.

  • 这里是的,还是推荐的安装方法如 http://raku.org/getting-started/和 ps:使用OS X

  • 问题内容: 我正在从xml配置转移到注释。我想转换一个会话范围的bean是 可以通过注释完成此操作吗?如果没有,我该怎么做才能使该声明继续工作? 问题答案: 在spring上下文xml中,执行以下操作: 请注意,尽管如此,你将需要为该包中的所有类编写接口。

  • 我目前使用PostGIS作为我在python脚本中执行的许多空间功能的主干。特别是取几个shapefile几何图形,看看它们是否相交,然后将它们分类到不同的目录中。我使用shp2pgsql上传shapefiles,然后使用ST_Intersects关联它们,然后使用脚本中的os/shutil函数对它们进行排序。 我的问题是,我们的一个团队只在政府网络上工作,无法获得系统管理员的postgres/p

  • do

    描述 (Description) 提供块时,此函数执行,就像BLOCK是一个函数一样,返回块中计算的最后一个语句的值。 当提供EXPR时,请执行EXPR指定的文件,就像它是另一个Perl脚本一样。 如果提供子程序SUB,则使用LIST作为参数执行子程序,如果已定义SUB,则引发异常。 语法 (Syntax) 以下是此函数的简单语法 - do BLOCK do EXPR do SUB(LIST)