【问题标题】:How to match digits in perl glob如何匹配perl glob中的数字
【发布时间】:2014-06-05 22:19:47
【问题描述】:
$dir_path = (-d ("./abc/dir-\d.\d.\d")) ?
            glob("./abc/dir-\d.\d.\d/my-dir*") : "my-dir-doesnot-exists";

这是一个有效的全局选项吗?我可以使用 \d 来匹配目录路径中的数字吗?

$dir_path 应该得到 "./abc/dir-#.#.#/my-dir/some_dir_name" 如果 "./abc/dir-#.#.#" 存在(其中 # 是任何数字) else "我的目录不存在”字符串

【问题讨论】:

  • 1.我不想在 -d 中添加 glob,现在编辑了代码。 2. 明白了,谢谢。 3.我现在改写了这个问题,请看看它是否澄清。谢谢。

标签: regex perl glob


【解决方案1】:

您在标量上下文中调用glob 的两个实例(但不是作为迭代器),这是非常错误的。例如,

 my $foo = glob("a");
 my $bar = glob("a");
 say $foo // "[undef]";    # a
 say $bar // "[undef]";    # [undef]

glob 语言与正则表达式语言完全不同。 \d 不起作用,但 [0123456789] 会。

my @dir_paths = glob("./abc/dir-[0123456789].[0123456789].[0123456789]/my-dir*");

die "No match!"         if !@dir_paths;
die "Too many matches!" if @dir_paths > 1;

my $dir_path = $dir_paths[0];

【讨论】:

  • 好的,我明白了。 \d\d 可以翻译成 [0123456789][0123456789] 。但是如何将\d+ 翻译成 glob?
  • @SL5net。你不能。 (这将生成无穷无尽的列表)
  • 好的。那么 \d{1,5} 可以创建一个 5 行的结束列表并且可以工作吗?
  • @SL5net, foo\d{1,5} 会是 foo[0123456789] foo[0123456789][0123456789] foo[0123456789][0123456789][0123456789] foo[0123456789][0123456789][0123456789][0123456789] foo[0123456789][0123456789][0123456789][0123456789][0123456789],但也许 foo[0123456789]* 就足够了吗?
  • (我错了“那会生成无穷无尽的列表”。{} 生成时,[] 匹配。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
相关资源
最近更新 更多