Pod::Tidy(3pm)
π Pod::Tidy β a reformatting Pod Processor π
okay bestie, so this is Pod::Tidy, a user-contributed Perl module (perl doc, obviously, it's a (3pm) situation) and it is literally the module that makes your Pod look cute instead of chaotic. No cap.
β¨ SYNOPSIS β¨
use Pod::Tidy qw( tidy_files tidy_filehandle );
my $processed = Pod::Tidy::tidy_files(
files => \@list,
ignore => [qr/foo/, qr/bar/],
recursive => $recursive,
verbose => $verbose,
inplace => $inplace,
nobackup => $nobackup,
columns => $columns,
);
Pod::Tidy::tidy_filehandle($input);
πΈ DESCRIPTION πΈ
This module does all the heavy lifting for the podtidy utility π«Ά β like, it's the muscle behind the whole glow-up. But also, the API is general enough that you can just use it directly if that's your vibe. main character energy honestly.
π USAGE π
Import Parameters π
This module accepts no arguments to its import method and exports no symbols. It's giving "I don't do small talk", and honestly? Respect.
Exportable Subroutines π¦
tidy_files( ... )β accepts a mandatory hash.
my $processed = Pod::Tidy::tidy_files(
files => \@list,
ignore => [qr/foo/, qr/bar/],
recursive => $recursive,
verbose => $verbose,
inplace => $inplace,
nobackup => $nobackup,
columns => $columns,
);
filesβ an array ref to a list of files and/or directories.ignoreβ an array ref to regex objects, used to reject files and/or directories. Each pattern gets tried for a match against, in order: the absolute file path, the relative (canonical) file path, and the basename. For directories, the "basename" is the right-most path component. Like, the "basename" of/foo/bar/baz/would bebaz. β¨
This key is optional.
recursiveβ acceptsundef,0, or1. Set it to1and any directories you handed to thefileskey get recursively expanded. Defaults toundef.
This key is optional.
verboseβ acceptsundef,0, or1.1turns on verbose warnings. Defaults toundef.
This key is optional.
inplaceβ acceptsundef,0, or1.1turns on in-place reformatting of files. Updated files get backed up unless thenobackupkey is set. Themtimeof the file is guarenteed not to change unless formatting changes actually happened. Defaults toundef.
This key is optional.
nobackupβ acceptsundef,0, or1. Set it to1and files being reformatted in place will not be backed up. Defaults toundef.
This key is optional.
columnsβ accepts any number. Sets the line width of the reformatted pod. Defaults to76(Text::Wrap's default).
This key is optional.
Before processing a file, it gets checked for:
- correct access permissions
- containing Pod
- legal Pod syntax
Any file that fails to meet those criteria will not be processed. (vibe check: failed π)
Returns a count of processed files, or undef if no files could be processed.
tidy_filehandle($input)β accepts an open filehandle. Data from the filehandle is processed as it's read, so this subroutine can be used to filter large amounts of data. Because of this behavior, the input can not be checked in advance to verify a) that it's actually Pod and b) that the Pod document uses only valid Pod syntax. Output is set toSTDOUT. Returns nothing.
Internal Subroutines π
These subroutines are not exportable. They're backstage. Don't touch, bestie.
backup_filebasebuild_pod_queueprocess_pod_queuevalid_pod_syntax
π₯ DEVELOPER NOTES π₯
Efficiency concerns π
The tidy_files() subroutine does a number of highly inefficient things. Each file is opened and closed at least 3 different times as it's passed through a number of different modules just to see if it meets the processing criteria. This shouldn't be a major performance issue with a modern OS's VM subsystem, but it still leaves much to be desired. ngl, it's a lot.
When doing inplace file reformatting, a complete copy of the original file and the updated file are held in memory for comparison. So you're limited to reformatting Pod documents < ( available_system_memory / 2 ). That's the rule, no cap.
π GOTCHAS π
Pod files not identified
Due to a bug in the version of contains_pod in Pod::Find bundled with Pod::Parser 1.33, Pod containing files will not be detected if the only =[foo]N directive is on the first line of the file. For example:
=head1 foo
foobarbaz
=cut
Would not be detected unless there was a newline before =head1 foo. See CPAN bug #14871 for a patch to correct Pod::Find. This should be fixed in version 1.34 of Pod::Parser.
Mangled verbatim blocks π
Unfortunately, the perldoc utility doesn't follow perlpodspec for what it considers a verbatim block. As far as perldoc is concerned, any line that begins with whitespace is in a verbatim block. While the Pod spec requires that all blocks are separated by a blank line.
Consider this example:
=head1 What Would Brian Boitano Do?
What would Brian Boitano do
If he was here right now?
He'd make a plan and he'd follow through
That's what Brian Boitano'd do
When Brian Boitano was in the olympics
Skating for the gold
He'd do sound cows and a triple relux
wearin a blindfold
=cut
perldoc incorrectly considers the second paragraph to be indented and would display it as one might be expecting. However, podtidy would turn it into this:
=head1 What Would Brian Boitano Do?
What would Brian Boitano do If he was here right now? He'd make a plan and
he'd follow through That's what Brian Boitano'd do When Brian Boitano was
in the olympics Skating for the gold He'd do sound cows and a triple
relux wearin a blindfold
=cut
If a single blank line is added between the two paragraphs as required by perlpodspec, the original document would look like this:
=head1 What Would Brian Boitano Do?
What would Brian Boitano do
If he was here right now?
He'd make a plan and he'd follow through
That's what Brian Boitano'd do
When Brian Boitano was in the olympics
Skating for the gold
He'd do sound cows and a triple relux
wearin a blindfold
=cut
Then the result from podtidy would be nice and... well... tidy. β¨
=head1 What Would Brian Boitano Do?
What would Brian Boitano do If he was here right now? He'd make a plan and he'd
follow through That's what Brian Boitano'd do
When Brian Boitano was in the olympics
Skating for the gold
He'd do sound cows and a triple relux
wearin a blindfold
=cut
π CREDITS π
Larry Denneau denneau@ifa.hawaii.edu reported test failures caused by Module::Build stripping the execute bit from scripts/podtidy. π«Ά
Grant McLean grant@mclean.net.nz caught a grammatical error in the documentation.
Michael Cartmell Michael.Cartmell@thomson.com provided some grammatical corrections and a patch to fix Pod::Tidy::build_pod_queue() tests on Win32, reporting test failures on Win32 caused by differing newline encodings, and reporting CPANPLUS playing badly with Module::Build's build_requires.
Hanno Hecker <vetinari@ankh-morp.org> provided a patch to allow the column width to specified in both the Pod::Tidy library and podtidy utility.
π SUPPORT π
Please contact the author directly via e-mail.
π AUTHOR π
Joshua Hoblitt jhoblitt@cpan.org
π COPYRIGHT π
Copyright (c) 2005 Joshua Hoblitt. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
The full text of the licenses can be found in the LICENSE file included with this module, or in perlartistic and perlgpl Pods as supplied with Perl 5.8.1 and later.
π§ SEE ALSO π§
podtidy, Pod::Wrap::Pretty, podwrap, Pod::Wrap, Perl::Tidy
okay that's the whole thing bestie, you ate π β¨
this was perl v5.42.0, dated 2025-07-25 β user contributed perl documentation, Pod::Tidy(3pm) π¦ go forth and tidy, periodt π
π¦ where this page comes from
- fedora 43: perl-Pod-Tidy 0.10-29.fc43 Β· GPL-1.0-or-later OR Artistic-1.0-Perl
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms