If you have a question on how to do something in Perl, or you need a Perl solution to an actual real-life problem, or you're unsure why something you've tried just isn't working... then this section is the place to ask.

However, you might consider asking in the chatterbox first (if you're a registered user). The response time tends to be quicker, and if it turns out that the problem/solutions are too much for the cb to handle, the kind monks will be sure to direct you here.

Post a new question!

User Questions
Modern Subroutine Signature Requires Perl Version
6 direct replies — Read more / Contribute
by InfiniteSilence
on Apr 21, 2026 at 10:01

    I feel like this question has been asked in the past but I could not find it in the search.

    So I am running this code snippet from Dave Cross' blog titled, Summarizing a Month of Git Activity with Perl (and a Little Help from AI) and I ran into a new feature of Perl -- subroutines that take named arguments. We had prototypes in the past but people said they were wonky so I avoided them for the most part.

    So here I am trying to use this thing and I start getting a weird error:

    #!/usr/bin/perl -w use strict; # LEARN: weird -- the method has named parameters ... since v5.36 sub commits_for_month ($repo, $since, $until) { my $cmd = sprintf( q{git -C %s log --since="%s" --until="%s" --pretty=format:"%%s"}, $repo, $since, $until ); my @commits = `$cmd`; chomp @commits; return @commits; } 1;

    I get...,

    llegal character in prototype for main::commits_for_month : $repo, $si +nce, $until at ./gitter.pl line 7. Global symbol "$repo" requires explicit package name (did you forget t +o declare "my $repo"?) at ./gitter.pl line 10. Global symbol "$since" requires explicit package name (did you forget +to declare "my $since"?) at ./gitter.pl line 10. Global symbol "$until" requires explicit package name (did you forget +to declare "my $until"?) at ./gitter.pl line 11. ./gitter.pl had compilation errors.

    My Perl version:

    This is perl 5, version 40, subversion 1 (v5.40.1) built for x86_64-li +nux-thread-multi ...

    When I look this up using Google's handy-dandy AI it tells me all about the normal way to get passed-in parameters in a subroutine and then tells me that this new syntax is available in v5.36. So I add,

    use v5.36;

    To my code and voila, the code compiles,

    perl -c ./gitter.pl ./gitter.pl syntax OK

    Dave's example didn't specify the version like this in his code. Is there something in my environment I am supposed to set to avoid this from happening?

    Celebrate Intellectual Diversity

Failed 2 tests on CygPerl for Test2::Harness; would a newer perl pass?
2 direct replies — Read more / Contribute
by Intrepid
on Apr 15, 2026 at 14:44

    I tried installing Test2::Harness and a couple tests failed. I am not totally understanding the output and if someone knowledgeable could interpret this for me I'd be grateful.

    
    
    Running make test for EXODIST/Test2-Harness-1.000170.tar.gz
    PERL_DL_NONLAZY=1 "/usr/bin/perl.exe" "-Iblib/lib" "-Iblib/arch" test.pl
    
      FAIL    job 46  +~find_in_updir
      PASS    job 46    + Found file in expected spot
      FAIL    job 46    + Found file in expected spot
      DEBUG   job 46    | t/unit/App/Yath/Util.t line 133
    (  DIAG  )  job 46    | +---------+----+-----------------------------------------------------------+
    (  DIAG  )  job 46    | | GOT     | OP | CHECK                                                     |
    (  DIAG  )  job 46    | +---------+----+-----------------------------------------------------------+
    (  DIAG  )  job 46    | | <UNDEF> | =~ | (?^:\/cygdrive\/c\/Users\/somia\/AppData\/Local\/Temp\/ya |
    (  DIAG  )  job 46    | |         |    | th\-149000\-j3p7oZ\/tmp\/FJbCQG\/17DQP5yPmV\/thefile$)    |
    (  DIAG  )  job 46    | +---------+----+-----------------------------------------------------------+
      PLAN    job 46    | Expected assertions: 2
                job 46    ^
    (  DIAG  )  job 46    Failed test 'find_in_updir'
    (  DIAG  )  job 46    at t/unit/App/Yath/Util.t line 134.
    
    -------------------------------------------------------------------------------------------
    
      FAIL    job 57  + /cygdrive/c/Users/somia/AppData/Local/Temp has correct permissions
      DEBUG   job 57    t2/tmp_perms.t line 36
    
    The following jobs failed at least once:
    +--------------------+-----------+--------------------+--------------------+
    | Job ID             | Times Run | Test File          | Succeeded Eventual |
    |                    |           |                    | ly?                |
    +--------------------+-----------+--------------------+--------------------+
    |                    |           |                    |                    |
    | 796D54CF-8067-1014 | 2         | t/unit/App/Yath/Ut | NO                 |
    | -B37C-A366FD41E411 |           | il.t               |                    |
    |                    |           |                    |                    |
    | 7973C25C-8067-1014 | 2         | t2/tmp_perms.t     | NO                 |
    | -B37C-A366FD41E411 |           |                    |                    |
    +--------------------+-----------+--------------------+--------------------+
    
    The following jobs failed:
    +---------------------------------+------------------------+---------------+
    | Job ID                          | Test File              | Subtests      |
    +---------------------------------+------------------------+---------------+
    | 796D54CF-8067-1014-B37C-A366FD4 | t/unit/App/Yath/Util.t | find_in_updir |
    | 1E411                           |                        |               |
    |                                 |                        |               |
    | 7973C25C-8067-1014-B37C-A366FD4 | t2/tmp_perms.t         |               |
    | 1E411                           |                        |               |
    +---------------------------------+------------------------+---------------+
    
                                        Yath Result Summary
    -------------------------------------------------------------------------------------------
         Fail Count: 2
         File Count: 91
    Assertion Count: 1996
          Wall Time: 632.81 seconds
           CPU Time: 1960.39 seconds (usr: 3.67s | sys: 1.70s | cusr: 459.45s | csys: 1495.57s)
          CPU Usage: 309%
        -->  Result: FAILED  <--
    
    yath exited with 256 yath exited with 256
    not ok 1 - Passed tests when run by yath (allow fork)
    not ok 2 - Passed tests when run by yath (no fork)
    
    -------------------------------------------------------------------------------------------
    
    My Perl and System characteristics:

    cygwin_nt-10.0-26200 - 3.7.0
    AMD Ryzen 5 4600H with Radeon Graphics (AuthenticAMD 3000MHz) x86_64
    Perl (/usr/bin/perl:
    This is perl 5, version 40, subversion 3 (v5.40.3) built for x86_64-cygwin-threads-multi
    

    Thanks, all.
        – Soren
    Apr 15, 2026 at 18:38 UTC

    A just machine to make big decisions
    Programmed by fellows (and gals) with compassion and vision
    We'll be clean when their work is done
    We'll be eternally free yes, and eternally young
    Donald Fagen —> I.G.Y.
    (Slightly modified for inclusiveness)

metacpan fastapi can't find the Config module
3 direct replies — Read more / Contribute
by Anonymous Monk
on Apr 15, 2026 at 10:39
    I ran into this problem looking up module versions with fastapi on metacpan:
    % perl -MHTTP::Tiny -MJSON::PP -le 'print decode_json(HTTP::Tiny->new- +>get("https://fastapi.metacpan.org/v1/module/" . shift)->{content})-> +{version}' Encode 3.21 perl -MHTTP::Tiny -MJSON::PP -le 'print decode_json(HTTP::Tiny->new->g +et("https://fastapi.metacpan.org/v1/module/" . shift)->{content})->{v +ersion}' Config <NOTHING GETS PRINTED>
    Results from direct access:
    fastapi.metacpan.org/v1/module/Encode { "abstract" : "character encodings in Perl"... fastapi.metacpan.org/v1/module/Config { "code" : 404, "message" : "Not found" }
ExtUtils::Installed fails to find Catalyst because it doesn't have a .packlist
3 direct replies — Read more / Contribute
by Anonymous Monk
on Apr 15, 2026 at 10:27
    % perl -MExtUtils::Installed -le 'print for ExtUtils::Installed->new-> +files("Catalyst")' Catalyst is not installed at -e line 1. % perl -MModule::Metadata -le 'print Module::Metadata->new_from_module +("Catalyst")->{filename}' /perl5/perlbrew/perls/perl-5.42.0/lib/site_perl/5.42.0/Catalyst.pm
    Compare to module with a .packlist:
    % perl -MExtUtils::Installed -le 'print ExtUtils::Installed->new->pack +list("CGI")->packlist_file' /perl5/perlbrew/perls/perl-5.42.0/lib/site_perl/5.42.0/darwin-2level/a +uto/CGI/.packlist ls -l /perl5/perlbrew/perls/perl-5.42.0/lib/site_perl/5.42.0/darwin-2l +evel/auto/CGI -rw-r--r-- 1 user staff 1.3K Jan 2 00:34 .packlist drwxr-xr-x 3 user staff 96B Jan 10 05:23 Ajax drwxr-xr-x 3 user staff 96B Jan 10 05:24 Application drwxr-xr-x 3 user staff 96B Jan 10 05:32 Compress drwxr-xr-x 3 user staff 96B Jan 10 05:33 PSGI drwxr-xr-x 3 user staff 96B Jan 10 05:33 Prototype drwxr-xr-x 3 user staff 96B Dec 17 11:39 Simple drwxr-xr-x 3 user staff 96B Dec 17 11:39 Struct drwxr-xr-x 3 user staff 96B Dec 17 11:39 Wiki % ls -l /perl5/perlbrew/perls/perl-5.42.0/lib/site_perl/5.42.0/darwin- +2level/auto/Catalyst drwxr-xr-x 4 user staff 128B Apr 15 07:00 Action drwxr-xr-x 4 user staff 128B Apr 15 07:00 Controller drwxr-xr-x 3 user staff 96B Dec 17 11:46 Devel drwxr-xr-x 4 user staff 128B Apr 15 07:00 Engine drwxr-xr-x 3 user staff 96B Dec 17 11:46 Manual drwxr-xr-x 5 user staff 160B Dec 17 11:46 Plugin drwxr-xr-x 3 user staff 96B Dec 17 11:45 Runtime
Perlbrew fails to install perl but reports success
2 direct replies — Read more / Contribute
by Anonymous Monk
on Apr 14, 2026 at 13:16
    % perlbrew install -v perl-5.8.9 ... DB_File.xs:998:34: error: incompatible function pointer types assignin +g to 'u_int32_t (*)(const void *, size_t)' (aka 'unsigned int (*)(con +st void *, unsigned long)') from 'int (const void *, size_t)' (aka 'i +nt (const void *, unsigned long)') [-Wincompatible-function-pointer-t +ypes] info->db_HA_hash = hash_cb ; ^ ~~~~~~~ DB_File.xs:1041:36: error: incompatible function pointer types assigni +ng to 'size_t (*)(const DBT *, const DBT *)' (aka 'unsigned long (*)( +const DBT *, const DBT *)') from 'int (const DBT *, const DBT *)' [-W +incompatible-function-pointer-types] info->db_BT_prefix = btree_prefix ; ^ ~~~~~~~~~~~~ ... 308 warnings and 2 errors generated. make[1]: *** [DB_File.o] Error 1 make: *** [lib/auto/DB_File/DB_File.bundle] Error 2 perl-5.8.9 is successfully installed. % perlbrew list * perl-5.42.0 perl-5.38.2 % perlbrew install -v perl-5.24.4 ... # Failed test 25 - SHA for cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblis +t/Kid.pm matches stashed SHA at porting/customized.t line 105 # got "47d2fdf890d7913ccd0e32b5f98a98f75745d227" # expected "bfd2aa00ca4ed251f342e1d1ad704abbaf5a615e" porting/customized.t .............................................. Failed 1/181 subtests ... Test Summary Report ------------------- porting/customized.t (Wstat +: 0 Tests: 181 Failed: 1) Failed test: 25 porting/libperl.t (Wstat +: 7424 Tests: 0 Failed: 0) Non-zero exit status: 29 Parse errors: No plan found in TAP output Files=2410, Tests=850611, 515 wallclock secs (11.99 usr 2.72 sys + 13 +4.39 cusr 16.64 csys = 165.74 CPU) Result: FAIL make: *** [test_harness] Error 1 perl-5.24.4 is successfully installed. % perlbrew list * perl-5.42.0 perl-5.38.2
    Summary of my perl5 (revision 5 version 42 subversion 0) configuration:
       
      Platform:
        osname=darwin
        osvers=23.3.0
        archname=darwin-2level
        gccversion='Apple LLVM 15.0.0 (clang-1500.3.9.4)'
    
        PERLBREW_PERL="perl-5.42.0"
        PERLBREW_SHELLRC_VERSION="1.02"
        PERLBREW_VERSION="1.02"
    
Reusing a complex regexp in multiple spots, escaping the regexp
3 direct replies — Read more / Contribute
by ecm
on Apr 12, 2026 at 15:27

    I have a fairly complex regexp, consisting of 9 match groups one of which has to match. I'm using copies of the exact same regexp in 4 different spots. All of them should match the same text. However, in one spot I want to access the match parameters as in $1 to $9, while in the other spots only one parameter ($3) and $`, $&, and $' are used.

    How do I abstract a regexp so I only need to define and update it in one spot, but still be able to access the capture match groups anyway?

    I tried storing the regexp pattern in a string variable then use that variable in the search, but I don't know how to correctly set the variable to a multi-line string (using a here document?) and use that for the pattern. Below is a dump of the working code, then the failing code and the error messages:

    Working:
    while (not $second and $linking =~ /(\bINT\s?[0-9A-Fa-f]{2}[Hh]? (?:\/(?:E?[ABCD][XHL]|E?[SD]I|E?[SB]P|[DESC]S)=[0-9A-F +a-f]{2,}[Hh]?)+ (?:\"[^"]+\")? ) |(\bINT\s?[0-9A-Fa-f]{2}[Hh]? (?:\"[^"]+\")? ) |(\b(?:E?A[XHL])=[0-9A-Fa-f]{2,}[Hh]? (?:\/(?:E?[ABCD][XHL]|E?[SD]I|E?[SB]P|[DESC]S)=[0-9A-F +a-f]{2,}[Hh]?)* (?:\"[^"]+\")? ) |(\#[0-9A-Z][0-9]{4}\b) |(\bMEM\s?[0-9A-Fa-fXx]{1,4}[Hh]?:[0-9A-Fa-fXx]{1,4}[Hh] +? (?:\"[^"]+\")? ) |(\bMEM\s?[0-9A-Fa-fXx]{1,8}[Hh]? (?:\"[^"]+\")? ) |(\@[0-9A-Fa-fXx]{1,4}[Hh]?:[0-9A-Fa-fXx]{1,4}[Hh]? (?:\"[^"]+\")? ) |(\bPORT\s?[0-9A-Fa-fXx]{1,4}[Hh]?-[0-9A-Fa-fXx]{1,4}[Hh +]? (?:\"[^"]+\")? ) |(\bPORT\s?[0-9A-Fa-fXx]{1,4}[Hh]? (?:\"[^"]+\")? ) /x) { my $intplus = $1; my $intonly = $2; my $regonly = $3; if (defined $regonly and not defined $int) { if (defined $link) { print_or_errorline("Entered reg only link without im +plicit INT"); return; } $maskhighlight .= " " x (length($`) + length($&)); $linking = $'; next; } my $table = $4; my $mem_16_16 = $5; my $mem_32 = $6; my $call = $7; my $portrange = $8; my $portsingle = $9; $maskhighlight .= " " x length $`;
    Failing:
    my $linkpattern = <<PATTERNEND; (\bINT\s?[0-9A-Fa-f]{2}[Hh]? (?:\/(?:E?[ABCD][XHL]|E?[SD]I|E?[SB]P|[DESC]S)=[0-9A-F +a-f]{2,}[Hh]?)+ (?:\"[^\"]+\")? ) |(\bINT\s?[0-9A-Fa-f]{2}[Hh]? (?:\"[^\"]+\")? ) |(\b(?:E?A[XHL])=[0-9A-Fa-f]{2,}[Hh]? (?:\/(?:E?[ABCD][XHL]|E?[SD]I|E?[SB]P|[DESC]S)=[0-9A-F +a-f]{2,}[Hh]?)* (?:\"[^\"]+\")? ) |(\#[0-9A-Z][0-9]{4}\b) |(\bMEM\s?[0-9A-Fa-fXx]{1,4}[Hh]?:[0-9A-Fa-fXx]{1,4}[Hh] +? (?:\"[^\"]+\")? ) |(\bMEM\s?[0-9A-Fa-fXx]{1,8}[Hh]? (?:\"[^\"]+\")? ) |(\@[0-9A-Fa-fXx]{1,4}[Hh]?:[0-9A-Fa-fXx]{1,4}[Hh]? (?:\"[^\"]+\")? ) |(\bPORT\s?[0-9A-Fa-fXx]{1,4}[Hh]?-[0-9A-Fa-fXx]{1,4}[Hh +]? (?:\"[^\"]+\")? ) |(\bPORT\s?[0-9A-Fa-fXx]{1,4}[Hh]? (?:\"[^\"]+\")? ) PATTERNEND while (not $second and $linking =~ /$linkpattern/x) { my $intplus = $1; my $intonly = $2; my $regonly = $3; if (defined $regonly and not defined $int) { if (defined $link) { print_or_errorline("Entered reg only link without im +plicit INT"); return; } $maskhighlight .= " " x (length($`) + length($&)); $linking = $'; next; } my $table = $4; my $mem_16_16 = $5; my $mem_32 = $6; my $call = $7; my $portrange = $8; my $portsingle = $9; $maskhighlight .= " " x length $`;
    My program uses curses for a TUI, so I redirected stderr to a file to capture perl error messages:
    Unrecognized escape \s passed through at /home/[user]/proj/tractest/in +tlist.pl line 419. Unrecognized escape \s passed through at /home/[user]/proj/tractest/in +tlist.pl line 419. Unrecognized escape \s passed through at /home/[user]/proj/tractest/in +tlist.pl line 419. Unrecognized escape \s passed through at /home/[user]/proj/tractest/in +tlist.pl line 419. Unrecognized escape \s passed through at /home/[user]/proj/tractest/in +tlist.pl line 419. Unrecognized escape \s passed through at /home/[user]/proj/tractest/in +tlist.pl line 419. Unmatched ( in regex; marked by <-- HERE in m/ INTs?[0-9A +-Fa-f]{2}[Hh]? (?:/(?:E?[ABCD][XHL]|E?[SD]I|E?[SB]P|[DESC]S)=[0-9A-Fa +-f]{2,}[Hh]?)+ (?:"[^"]+")? ) |INTs?[0-9A-Fa-f]{2}[Hh]? (?:"[^"]+")? ) |(?:E?A[XHL])=[0-9A-Fa-f]{2,}[Hh]? (?:/(?:E?[ABCD][XHL]|E?[SD]I|E?[SB]P|[DESC]S)=[0-9A-Fa +-f]{2,}[Hh]?)* (?:"[^"]+")? ) |(#[0-9A-Z][0-9]{4) <-- HERE |MEMs?[0-9A-Fa-fXx]{1,4}[Hh]?:[0-9A-Fa-fXx]{1, +4}[Hh]? (?:"[^"]+")? ) |MEMs?[0-9A-Fa-fXx]{1,8}[Hh]? (?:"[^"]+")? ) |(@[0-9A-Fa-fXx]{1,4}[Hh]?:[0-9A-Fa-fXx]{1,4}[Hh]? (?:"[^"]+")? ) |PORTs?[0-9A-Fa-fXx]{1,4}[Hh]?-[0-9A-Fa-fXx]{1,4}[Hh]? (?:"[^"]+")? ) |PORTs?[0-9A-Fa-fXx]{1,4}[Hh]? (?:"[^"]+")? ) / at /home/[user]/proj/tractest/intlist.pl line 447, <$array_lstff[... +]> line 197305.
NFS File Locking
5 direct replies — Read more / Contribute
by jbw8387
on Apr 08, 2026 at 09:02

    I have an NFS file system mounted on many machines. I am attempting to use file locking to get exclusive access by one system to a file. The critical code section shown here:

    # loop through file names looking for one we can lock open ( my $file_handle, '+<', $file_name ) or next; if ( !flock( $file_handle, LOCK_EX | LOCK_NB ) ) { close( $file_handle ); next; } # do some work here based on the file contents unlink $file_name; close( $file_handle );

    This almost always works, but occasionally there is a failure where two machines get a lock on the same file. It appears there is a race between unlinking (deleting) the file and releasing the lock. It seems like there is a small window where the lock is actually released before the file is deleted allowing another machine to lock and read the file before it is deleted.

    I am wondering if this is a known problem and if there is a preferred way to work around this.

It's been a long time
3 direct replies — Read more / Contribute
by stevieb
on Apr 08, 2026 at 05:01

    Been a lurker since ~2k and an active member since ~2k9. Threw a question to "AI" the other day to write a script to safely allow me to update an iptables chain that I need to implement remotely. The result is below. My question for the monks isn't a question. It's a request from an old timer to see if there are any newcomers who can rewrite this script in Perl, properly.

    #!/bin/sh # apply-new-iptables.sh OLD=/root/iptables-old.rules NEW=/root/iptables-new.rules # backup current iptables-save > "$OLD" # apply new rules iptables-restore < "$NEW" # start rollback timer: restore OLD after 60s if not canceled ( sleep 60 && iptables-restore < "$OLD" ) & ROLLBACK_PID=$! echo $ROLLBACK_PID > /tmp/iptables-rollback.pid echo "New rules applied. To keep them, run: kill $(cat /tmp/iptables-r +ollback.pid) && rm /tmp/iptables-rollback.pid"

    Hint: there is at least one hugely fundamental issue that AI hallucinated.

    -stevieb

    Update: Hablo español si prefieres.

Getting list of network interfaces
2 direct replies — Read more / Contribute
by Anonymous Monk
on Mar 25, 2026 at 20:17
    I need to get the list of network interface names and the network addresses to which they are bound. Unfortunately there's no standard method for this, and the two recommended CPAN modules (IO::Interface and Net::Interface) are buggy and unmaintained. So I am currently parsing the output of `ifconfig -a` or `ip addr show`. This works for my test machines, but I'm planning on distributing the script, so need to maximize portability among unixes.

    Using SIOCGIFCONF looks like an interesting alternative, but the only perl example I found is very non-portable: Re: How do I get the local internet IP address?. sys/ioctl.ph isn't present in any of my perlbrewed perls, and even after running h2ph, it fails with "unsupported architecture" for macOS. But I did confirm with the following C program that SIOCGIFCONF is relatively portable when implemented right: https://gist.github.com/OrangeTide/909204.

    Is there an alternative I missed?

Win32::OLE & encoding
2 direct replies — Read more / Contribute
by Denis Mikhailov
on Mar 25, 2026 at 09:44

    Hello.

    I am reading a .docx file in Russian. The code $text =~ s/^Испытательная(.*?)/\1/ug; is supposed to process a line by removing part of the text. If the text is written in English, everything is detected and trimmed correctly, but I cannot get it to work with Russian text. In the console, instead of Russian text, I see garbled characters. I've been dancing around encodings — utf8, utf16, cp1251, cp1252 — but none of them give the desired result. Apparently, I am doing something wrong.

    Important! When the text is written to a text file from the Word document, it displays correctly.

    I would appreciate your help. Thank you.

    #!/usr/bin/perl use Win32::OLE; use Win32::OLE::Enum; use utf8; use strict; my $text; my $paragraph; my $document = Win32::OLE -> GetObject($ARGV[1]); open (FH,">$ARGV[0]") || die "Can't open file: $!\n"; my $paragraphs = $document->Paragraphs(); my $enumerate = new Win32::OLE::Enum($paragraphs); while(defined($paragraph = $enumerate->Next())) { $text = $paragraph->{Range}->{Text}; $text =~ s/^&#1048;&#1089;&#1087;&#1099;&#1090;&#1072;&#1090;&#107 +7;&#1083;&#1100;&#1085;&#1072;&#1103;(.*?)/\1/ug; $text =~ s/[\n\r]//g; print FH "$text\n"; }

Add your question
Title:
Your question:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":


  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.