gpt4 book ai didi

perl - 在 Parse::RecDescent 正则表达式中插入变量

转载 作者:行者123 更新时间:2023-12-04 07:07:06 26 4
gpt4 key购买 nike

我正在研究 Parse::RecDescent 语法来读取给定的人类可读规则集,然后吐出一个计算机更容易阅读的文件。

其中一个标记是“关键字”列表;大约 26 个不同的关键字。这些可能会随着时间而改变,并且可能会被多段代码引用。因此,我想将关键字 y 的东西存储在数据文件中并加载它们。

Parse::RecDescent 的一个特性是能够在正则表达式中插入变量,我想使用它。

我写了一些代码作为概念证明:

@arr = ("foo", "bar", "frank", "jim");


$data = <<SOMEDATA;
This is some data with the word foo in it
SOMEDATA

$arrstr = join("|", @arr);

if($data =~ /($arrstr)/)
{
print "Matched $1\n";
}
else
{
print "Failed to match\n";
}

这工作正常。
当我转到我的主程序来实现它时,我写道:
{
my $myerror = open(FILE, "data.txt") or die("Failed to open data");
my @data_arr = <FILE>;
close FILE;
my $dataarrstr = join("|", @data_arr);

}
#many rules having nothing to do with the data array are here...

event : /($dataarrstr)/
{ $return = $item[1]; }
|

此时,我从 P::RD 收到此错误: ERROR (line 18): Invalid event: Was expecting /($dataarrstr)/ .

我不知道为什么。有没有人有任何想法可以帮助我在这里?

编辑:
这不是范围界定问题 - 我已经尝试过了。我也试过 m{...} 语法。

最佳答案

仔细阅读文档和在 http://perlmonks.org/?node_id=384098 上提出的非常相似的问题后,我想出了这个解决方案。

event :/\w+/
{
$return = ::is_valid_event($item[1]);
}
| <error>

语法之外——
#This manages the problem of not being able to interpolate the variable 
#in the grammar action
sub is_valid_event {
my $word = shift @_;
if($word =~ /$::data_str/)
{
return $word;
}
else
{
return undef;
}
}

关于perl - 在 Parse::RecDescent 正则表达式中插入变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/971433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com