The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


Perl::Tags - Generate (possibly exuberant) Ctags style tags for Perl sourcecode


Using Perl::Tags to assist your development

Perl::Tags is designed to be integrated into your development environment. Here are a few ways to use it:

With Vim

Perl::Tags was originally designed to be used with vim. See for an easily installable Plugin.

NB: You will need to have a vim with perl compiled in it. Debuntu packages this as vim-perl. Alternatively you can compile from source (you'll need Perl + the development headers libperl-dev).

(Note that perl-tags-vim includes its own copy of Perl::Tags through the magic of git submodules and App::FatPacker, so you don't need to install this module from CPAN if you are only intending to use it with Vim as above!)

From the Command Line

See the "perl-tags" in bin script provided.

From other editors

Any editor that supports ctags should be able to use this output. Documentation and code patches on how to do this are welcome.

Using the Perl::Tags module within your code

        use Perl::Tags;
        my $naive_tagger = Perl::Tags::Naive->new( max_level=>2 );
            files => ['', ''],

        print $naive_tagger; # stringifies to ctags file

Recursively follows use and require statements, up to a maximum of max_level.


There are several taggers distributed with this distribution, including:


This is a more-or-less straight ripoff, slightly updated, of the original pltags code. This is a "naive" tagger, in that it makes pragmatic assumptions about what Perl code usually looks like (e.g. it doesn't actually parse the code.) This is fast, lightweight, and often Good Enough.

This has additional subclasses such as Perl::Tags::Naive::Moose to parse Moose declarations, and Perl::Tags::Naive::Lib to parse use lib.


Uses the PPI module to do a deeper analysis and parsing of your Perl code. This is more accurate, but slower.


Can run multiple taggers, such as ::Naive and ::PPI, combining the results.


Documentation patches are welcome: in the meantime, have a look at Perl::Tags::Naive and its subclasses for a simple line-by-line method of tagging files. Alternatively Perl::Tags::PPI uses PPI's built in method of parsing Perl documents.

In general, you will want to override the get_tags_for_file method, returning a list of Perl::Tags::Tag objects to be registered.

For recursively checking other modules, return a Perl::Tags::Tag::Recurse object, which does not create a new tag in the resulting perltags file, but instead processes the next file recursively.


    * Recursive, incremental tagging.
    * parses `use_ok`/`require_ok` line from Test::More



Perl::Tags is an abstract baseclass. Use a class such as Perl::Tags::Naive and instantiate it with new.

    $naive_tagger = Perl::Tags::Naive->new( max_level=>2 );

Accepts the following parameters

    max_level:    levels of "use" statements to descend into, default 2
    do_variables: tag variables?  default 1 (true)
    exts:         use the Exuberant extensions


A Perl::Tags object will stringify to a textual representation of a ctags file.

    print $tagger;


Delete all tags, but without touching the "order" seen, that way, if the tags are recreated, they will remain near the top of the "interestingness" tree


Save the file to disk if it has changed. (The private {is_dirty} attribute is used, as the tags object may be made up incrementally and recursively within your IDE.


Scan one or more Perl file for tags

        files => [ '',  '' ] 
        files   => '',
        refresh => 1,

queue, popqueue

Internal methods managing the processing

process_item, process_file, get_tags_for_file

Do the heavy lifting for process above.

Taggers must override the abstract method get_tags_for_file.


The parsing is done by a number of lightweight objects (parsers) which look for subroutine references, variables, module inclusion etc. When they are successful, they call the register method in the main tags object.

Note that if your tagger wants to register not a new declaration but rather a usage of another module, then your tagger should return a Perl::Tags::Tag::Recurse object. This is a pseudo-tag which causes the linked module to be scanned in turn. See Perl::Tags::Naive's handling of use statements as an example!


"perl-tags" in bin


Contributions are always welcome. The repo is in git:

Please fork and make pull request. Maint bits available on request.


many patches for features and bugfixes


::PPI subclass

Ian Tegebo

patch to use File::Temp


::Naive::Moose, ::Naive::Spiffy and ::Naive::Lib subclasses


prodding me to make repo public


Command line interface, applying patches

Andreas Koenig


    osfameron (2006-2014) -
                            and contributors, as above

For support, try emailing me or grabbing me on irc on

This was originally ripped off, as distributed with vim and available from Version 2.3, 28 February 2002 Written by Michael Schaap <>.

This is licensed under the same terms as Perl itself. (Or as Vim if you prefer).