2013-03-26 39 views
0

我试图写一个Perl模块,这需要另一个文件作为输入并打印所有使用的语句(除严格和警告)的grep或地图,找到在perl中使用的语句

my @result = grep /use\s+([^;(strict|warnings)]+)/, @file; 

此打印:

use Package1; 
use Package2; 

但是我只想要“Package1”部分。因此,当图被用于:

my @result = map /use\s+([^;(strict|warnings)]+)/, @file; 

此返回错误的值(返回第一2或3个字符)

my @result = map /use\s+([^;]+)/, @file; 

返回包1,包2,严格的,警告。

我可以知道如何更正第一条语句中的正则表达式吗?

感谢

+0

这仅仅是一个学习正则表达式和map/grep的测试用例,还是你实际上试图找到use/require语句?如果后者有这样做的模块。 – 2013-03-26 03:57:20

+0

@JoelBerger后者。你能指出我正确的方向吗?谢谢 – psy 2013-03-26 05:51:14

+0

Schwern似乎打败了我。这说,看看我的评论。 – 2013-03-26 12:39:24

回答

2

扔在一个grep过滤:

my @result = grep { !/^(?:strict|warnings)$/ } map /use\s+([^;]+)/, @file; 
3

有这样做的模块。 Perl::PrereqScannerDist::Zilla的用途,我发现它工作得很好。

和Neil Bowers有a nice review of the available solutions。感谢@JoelBerger在评论中指出了这一点。

对于通用Perl代码扫描,最好使用对Perl语法有所了解的PPI。比如Perl :: PrereqScanner和Perl::Critic使用它。

+0

提及'PPI'+1 +1 – Zaid 2013-03-26 07:22:25

+0

Neil Bowers在这件事上有一篇不错的评论文章:http://neilb.org/reviews/dependencies.html – 2013-03-26 12:38:54