LWP::Simple(3)

πŸ’… LWP::Simple(3) β€” like, the manual page, but make it make sense

Okay bestie, so this is the manual page for LWP::Simple, straight out of the perl section of your man pages. Buckle up, it's actually kind of iconic.


✨ NAME ✨

LWP::Simple β€” a simple procedural interface to LWP. Yes, procedural. No objects. No drama. Just vibes and function calls. 🫢


🌸 SYNOPSIS 🌸

Look at her go, literally one line and you're browsing the web:

perl -MLWP::Simple -e 'getprint "http://www.sn.no"'

Or if you wanna be all proper about it:

use LWP::Simple;
$content = get("http://www.sn.no/");
die "Couldn't get it!" unless defined $content;

if (mirror("http://www.sn.no/", "foo") == RC_NOT_MODIFIED) {
    ...
}

if (is_success(getprint("http://www.sn.no/"))) {
    ...
}

See that die "Couldn't get it!" unless defined $content;? That's the self-care check. Never skip it. πŸ’€


πŸ¦‹ DESCRIPTION πŸ¦‹

So this module is for people who want a simplified view of the libwww-perl library. It's also, and I quote, suitable for one-liners β€” which is giving main character energy, honestly.

But here's the tea: if you need more control, or you actually wanna peek at the header fields in the requests sent and responses received, then you should use the full object-oriented interface provided by the LWP::UserAgent module. LWP::Simple is the chill little sister; LWP::UserAgent is the one with the whole corporate job.

The module will also export the LWP::UserAgent object as $ua if you ask for it explicitly. Like, explicitly explicitly. It's not gonna just show up uninvited. πŸ™ˆ

And the user agent created by this module will identify itself as LWP::Simple/#.##, and it'll initialize its proxy defaults from the environment (by calling $ua->env_proxy). So it knows where it is. Environmentally aware queen. 🌈


πŸŽ€ FUNCTIONS πŸŽ€

The following functions are provided (and exported, bestie β€” you don't even have to ask) by this module:

πŸ’– get πŸ’–

my $res = get($url);

The get() function will fetch the document identified by the given URL and hand it right back to you. It returns undef if it fails β€” so like, check for that, mmkay?

The $url argument can be either a string or a reference to a URI object. Flexible. Versatile. We stan.

⚠️ Okay so warning time: you will not be able to examine the response code or response headers (like Content-Type) when you're accessing the web using this function. It's a mystery box, bestie. If you need that information you should use the full OO interface (see LWP::UserAgent).
my $res = head($url);

Get document headers. Returns the following 5 values if successful:

($content_type, $document_length, $modified_time, $expires, $server)

Five whole values. A whole little squad. 🫢

Returns an empty list if it fails. And in scalar context, it returns TRUE if successful. So like, context matters, iykyk.

πŸ“ getprint πŸ“

my $code = getprint($url);

Get and print a document identified by a URL. The document is printed to the selected default filehandle for output (normally STDOUT) as data is received from the network β€” so it's streaming, it's live, it's giving real time.

If the request fails, then the status code and message are printed on STDERR. (Not STDOUT, don't @ me.) The return value is the HTTP response code.

🧚 getstore 🧚

my $code = getstore($url, $file)
my $code = getstore($url, $filehandle)

Gets a document identified by a URL and stores it in the file. Return value is the HTTP response code. Simple as that, no cap.

You may also pass a writeable filehandle or similar, such as a File::Temp object. So many options, so little time. ✨

πŸ‘‘ mirror πŸ‘‘

my $code = mirror($url, $file);

Get and store a document identified by a URL, using If-modified-since, and checking the Content-Length. Returns the HTTP response code. It's the polite one β€” it checks if anything even changed before downloading the whole thing again. Considerate icon. πŸ’…


⭐ STATUS CONSTANTS ⭐

This module also exports the HTTP::Status constants and procedures. You can use them when you check the response code from getprint in LWP::Simple, getstore in LWP::Simple or mirror in LWP::Simple. The constants are:

RC_CONTINUE
RC_SWITCHING_PROTOCOLS
RC_OK
RC_CREATED
RC_ACCEPTED
RC_NON_AUTHORITATIVE_INFORMATION
RC_NO_CONTENT
RC_RESET_CONTENT
RC_PARTIAL_CONTENT
RC_MULTIPLE_CHOICES
RC_MOVED_PERMANENTLY
RC_MOVED_TEMPORARILY
RC_SEE_OTHER
RC_NOT_MODIFIED
RC_USE_PROXY
RC_BAD_REQUEST
RC_UNAUTHORIZED
RC_PAYMENT_REQUIRED
RC_FORBIDDEN
RC_NOT_FOUND
RC_METHOD_NOT_ALLOWED
RC_NOT_ACCEPTABLE
RC_PROXY_AUTHENTICATION_REQUIRED
RC_REQUEST_TIMEOUT
RC_CONFLICT
RC_GONE
RC_LENGTH_REQUIRED
RC_PRECONDITION_FAILED
RC_REQUEST_ENTITY_TOO_LARGE
RC_REQUEST_URI_TOO_LARGE
RC_UNSUPPORTED_MEDIA_TYPE
RC_INTERNAL_SERVER_ERROR
RC_NOT_IMPLEMENTED
RC_BAD_GATEWAY
RC_SERVICE_UNAVAILABLE
RC_GATEWAY_TIMEOUT
RC_HTTP_VERSION_NOT_SUPPORTED

That's the whole mood ring of HTTP, bestie. Every status, every feeling. 🌈


πŸ”₯ CLASSIFICATION FUNCTIONS πŸ”₯

The HTTP::Status classification functions are:

πŸ’– is_success πŸ’–

my $bool = is_success($rc);

True if response code indicated a successful request. Slay. βœ…

πŸ’€ is_error πŸ’€

my $bool = is_error($rc)

True if response code indicated that an error occurred. Not slay, but at least you know. 😭


πŸ™ˆ CAVEAT πŸ™ˆ

Okay so, important psa incoming. Note that if you are using both LWP::Simple and the very popular CGI module, you may be importing a head function from each module β€” producing a warning like:

Prototype mismatch: sub main::head ($) vs none

Two heads, one namespace. It's giving love triangle. πŸ’€

Get around this problem by just not importing LWP::Simple's head function, like so:

use LWP::Simple qw(!head);
use CGI qw(:standard);  # then only CGI.pm defines a head()

Then if you do need LWP::Simple's head function, you can just call it as LWP::Simple::head($url). Fully qualified, no confusion, no warnings. Periodt. πŸ’…


🌟 SEE ALSO 🌟

Go read these next, bestie, they're all connected:

  • LWP
  • lwpcook
  • LWP::UserAgent
  • HTTP::Status
  • lwp-request
  • lwp-mirror

And that's the whole page! πŸ’– This little baddie shipped with perl v5.42.0, dated 2026-05-18 β€” so like, future-dated and flawless. Go fetch something. 🌸✨

πŸ“¦ where this page comes from