我有一個 perl 檔案,其中一些函式是使用特殊語法(Mojolicious)定義的:
$app->helper('helper1' => sub {
print "Hello 1";
});
$app->helper("helper2" => sub {
print "Hello 2";
});
$app->helper(helper3 => sub {
print "Hello 3";
});
helper1();
helper2();
helper3();
我設法創建 Perl 正則運算式來捕獲這些定義:
#!/usr/bin/perl
use strict;
use warnings;
use File::Slurp 'read_file';
my $code = read_file('helpers.pl');
my @matches = $code =~ /\$app\->helper\(['"]?(.*?)['"]? => sub/g;
foreach(@matches)
{
print "$_\n";
}
輸出:
helper1
helper2
helper3
但是我嘗試在 etags 中使用它失敗了;
etags -l perl --regex="/\$app\->helper\\\(['\"]\(.*?\)['\"] => sub/" ./helpers.pl
給出一個空的 TAGS 檔案。怎么了?
uj5u.com熱心網友回復:
您的問題之一是您的外殼逃逸,例如:
"\$xxx"將最終成為$xxx正則運算式中的 EOL。"\-"將在 POSIX shell 中擴展為\-.
您應該使用單引號字串來保存您的模式,因為單引號中唯一的特殊字符是單引號。如果模式應該是:
/\$app->helper\(['"](.*?)['"] => sub/
那么單引號字串將是:
'/\$app->helper\(['\''"](.*?)['\''"] => sub/'
我不使用 exuberant-ctags,而是從不使用 Universal Ctags。在 Universal Ctags 中,需要這樣寫:
/\$app->helper\(['"](.*)['"] => sub/\1/
請注意如何不支持非貪婪修飾符,以及我如何提供關鍵字創建部分:\1/在模式之后。
我將把上面的模式用單引號括起來作為練習留給讀者。
uj5u.com熱心網友回復:
Universal Ctags 剛剛引入了 pcre2 作為可選的正則運算式引擎。如果您使用 pcre2從 git 存盤庫 (git clone https://github.com/universal-ctags/ctags.git ) 中的最新代碼構建 ctags 可執行檔案,則可以使用非貪婪匹配。這意味著 Andreas Louv 顯示的命令列可能運行良好。
$ cat /tmp/foo.pl
$app->helper('helper1' => sub {
print "Hello 1";
});
$app->helper("helper2" => sub {
print "Hello 2";
});
$app->helper(helper3 => sub {
print "Hello 3";
});
helper1();
helper2();
helper3();
$ ./ctags -o - --regex-perl='/\$app->helper\(['\''"]?(.*?)['\''"]? => sub/\1/s/{pcre2}' /tmp/foo.pl
helper1 /tmp/foo.pl /^$app->helper('helper1' => sub {$/;" s
helper2 /tmp/foo.pl /^$app->helper("helper2" => sub {$/;" s
helper3 /tmp/foo.pl /^$app->helper(helper3 => sub {$/;" s
$ ./ctags -e --regex-perl='/\$app->helper\(['\''"]?(.*?)['\''"]? => sub/\1/s/{pcre2}' /tmp/foo.pl
$ cat TAGS
^L
/tmp/foo.pl,133
$app->helper('helper1' => sub {^?helper1^A1,0
$app->helper("helper2" => sub {^?helper2^A5,74
$app->helper(helper3 => sub {^?helper3^A9,148
$
您可以驗證 pcre2 是否鏈接到您的 ctags。
$ ./ctags --list-features | grep pcre2
pcre2 has pcre2 regex engine
$
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355721.html
