如何动态构建 Perl 正则表达式?

2024-01-12

我有一个 Perl 脚本,它使用 File::Next::files 遍历目录层次结构。它只会返回以“.avi”、“.flv”、“.mp3”、“.mp4”和“.wmv”结尾的脚本文件。它还会跳过以下子目录:“.svn”和任何以“.frames”结尾的子目录。这是在file_filter and descend_filter下面的子程序。

my $iter = File::Next::files(
        { file_filter => \&file_filter, descend_filter => \&descend_filter },
        $directory );

sub file_filter { 
    # Called from File::Next:files.
    # Only select video files that end with the following extensions.
    /.(avi|flv|mp3|mp4|wmv)$/
}

sub descend_filter { 
    # Called from File::Next:files.
    # Skip subfolders that either end in ".frames" or are named the following:
    $File::Next::dir !~ /.frames$|^.svn$/
}

我想要做的是将允许的文件扩展名和不允许的子目录名称放置在配置文件中,以便可以动态更新它们。

我想知道的是如何编写子例程以根据配置文件中的参数构建正则表达式构造?

/.(avi|flv|mp3|mp4|wmv)$/

$File::Next::dir !~ /.frames$|^.svn$/

假设您已解析配置文件以获取扩展名和忽略目录的列表,则可以将正则表达式构建为字符串,然后使用qr运算符将其编译为正则表达式:

my @extensions = qw(avi flv mp3 mp4 wmv);  # parsed from file
my $pattern    = '\.(' . join('|', @wanted) . ')$';
my $regex      = qr/$pattern/;

if ($file =~ $regex) {
    # do something
}

编译并不是绝对必要的;您可以直接使用字符串模式:

if ($file =~ /$pattern/) {
    # do something
}

目录有点困难,因为有两种不同的情况:全名和后缀。您的配置文件必须使用不同的键来明确哪个是哪个。例如“dir_name”和“dir_suffix”。对于全名,我只需构建一个哈希:

%ignore = ('.svn' => 1);

带后缀的目录可以按照与文件扩展名相同的方式完成:

my $dir_pattern = '(?:' . join('|', map {quotemeta} @dir_suffix), ')$';
my $dir_regex   = qr/$dir_pattern/;

您甚至可以将模式构建到匿名子例程中以避免引用全局变量:

my $file_filter    = sub { $_ =~ $regex };
my $descend_filter = sub {
    ! $ignore{$File::Next::dir} &&
    ! $File::Next::dir =~ $dir_regex;
};

my $iter = File::Next::files({
    file_filter    => $file_filter,
    descend_filter => $descend_filter,
}, $directory);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态构建 Perl 正则表达式? 的相关文章

  • 为什么不鼓励在 Windows 上将 PPM perl 模块与 Strawberry perl 一起使用?

    任何人都可以解释为什么人们会发表此评论吗 我在 stackoverflow 上看到了几个线程 像这个 https stackoverflow com questions 6643939 installing modules using st
  • 识别http链接并创建锚标记

    我正在尝试解析一些字符串 它嵌入了一些 http 链接 我想使用 jquery 在此字符串中动态创建锚标记 然后将它们显示在前端 以便用户可以单击它们 有没有办法做到这一点 Thanks 你可以这样做 function get the st
  • 跳过解析 CODE 标签内的 BBCode

    我正在使用以下方法解析 BBCoderegex以便将其替换为 HTML 我现在被困住了 因为 code 标签解析 基本上 当你这样做时 code b this is bb b u code in u i code i code 它不应该取代
  • JavaScript 使用正则表达式验证电话号码

    问候溢出者 我正在尝试编写一个正则表达式来验证 10 位数字 形式的电话号码 即 以下情况是有效的 1231231234 或 1111111111 无效的情况是少于 10 位或多于 10 位的数字字符串 到目前为止我的表达是这样的 d 10
  • 第一次如何配置postgresql?

    我刚刚安装了 postgresql 并在安装过程中指定了密码 x 当我尝试做的时候createdb并指定我收到消息的任何密码 createdb 无法连接到数据库 postgres 致命 用户密码身份验证失败 同样适用于createuser
  • 如果逗号不在两个双引号之间,则用逗号分隔

    我想用逗号分割这样的字符串 field1 value1 field2 value2 field3 value3 value4 into a string 看起来像 0 field1 value1 1 field2 value2 2 fiel
  • 音乐和弦部分拆分正则表达式

    这是此问题的后续问题 用于匹配音乐和弦的正则表达式 https stackoverflow com questions 11229080 regex for matching a music chord 是我问的 现在我有一个正则表达式来知
  • 从文件中删除包含非英语 (Ascii) 字符的行

    我有一个文本文件 其中包含来自不同语言的字符 例如 中文 拉丁文等 我想删除包含这些非英语字符的所有行 我想包含所有英文字符 a b 数字 0 9 和所有标点符号 我如何使用 awk 或 sed 等 unix 工具来完成此操作 Perl 支
  • 在前两个冒号上分割字符串

    我想在前两个冒号上拆分一列字符串 但不在任何后续冒号上拆分 my data lt read table text my string some data 123 34 56 78 100 87 65 43 21 200 a4 b6 c888
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • Visual Studio 2015:SQL 数据源:无法检索架构。确保 ConnectionString 和 SelectCommand 属性有效

    我有以下ASP Net网页的开发环境 VS 2015专业版 使用 Net Framework 4 0 MySQL服务器5 6 MySQL Net 连接器 6 9 5 MySQL for Visual Studio 2 0 2 我能够从 Vi
  • Emacs cperl - 常量块中的缩进

    我正在运行基于 GNU Emacs 24 3 50 2 的 Aquamacs 3 0a cperl 版本是 6 2 当我编辑 Perl 常量块时 我得到了我不想要的额外缩进 use constant ONE gt 1 TWO gt 2 TH
  • 替换字符以制作国际字母(变音符号)

    我正在尝试模仿国际键盘的工作方式 如果您使用其中之一死钥匙 http en wikipedia org wiki Dead key后面跟着一个字母 它将它们组合成相应的字符 例如 输入 a会导致 and o结果是 etc 我似乎无法让我的正
  • 正则表达式匹配除括号中的单词之外的所有单词 - javascript

    我使用以下正则表达式来匹配所有单词 mystr replace W s g function match p1 index title 请注意 单词可以包含特殊字符 例如德语变音符号 如何匹配除括号内的单词之外的所有单词 如果我有以下字符串
  • 在 Objective-C 中使用 perl?

    CPAN 有大量非常有用的库 除了将它们移植到 Objective C 之外 是否还有在 iOS 上将 Perl 代码嵌入到 Objective C 中的方法 我对使用特别感兴趣电子表格 阅读 http kobesearch cpan or
  • 如何从此正则表达式模式中获取以下用例的匹配项?

    我有正则表达式来匹配以下模式 用例链接 https regex101 com r wnp1k4 1 https regex101 com r wnp1k4 1 如何通过修改正则表达式来获得相同的匹配项 请帮忙 lt D a zA Z gt
  • 从 shell 脚本调用 Perl,如何将返回值从 Perl 传递到 shell?

    我成功地从 shell 脚本调用 Perl 脚本 现在我想将 Perl 脚本的返回值传递给 shell 脚本 指示它是否成功 我该怎么做呢 只需使用适当的退出值退出 Perl 脚本即可 exit exit value exit 0 if p
  • 使用西里尔字母的正则表达式

    我有一个用于文本区域字段中字数统计的 jQuery 函数 此外 它排除所有用 三重括号 封闭的单词 它对于拉丁字符效果很好 但对于西里尔字母句子有问题 我认为错误部分与正则表达式有关 field val replace g match b
  • 群组名称不能以数字开头?

    看来我不能使用像这样的正则表达式 P lt 74xxx gt 0 9 重新打包会引发错误 sre constants error bad character in group name u 74xxx 我似乎无法使用以数字开头的组名称 为什
  • Drupal URL 重写冲突

    我已将 Drupal 7 安装在站点的根目录中 htaccess 文件自安装以来未曾修改过 不过 我还在子目录中设置了 CodeIgniter 我在 CI 目录中创建了一个 htaccess 文件 其中包含从 url 中删除 index p

随机推荐