View on
MetaCPAN is shutting down
For details read Perl NOC. After June 25th this page will redirect to
Wolfgang Wiese > web > Web


Annotate this POD

View/Report Bugs


Web - A set of useful routines for many webworking purposes


This module was primarily made for UNIX/Linux-Systems. Parts of it cannot be used on other systems. E.g. the procedures for file locking demand systems that can use symlinks. If you use the modul on systems where symlinks cannot be used, fatal errors may happen.


use web;


This perl module serves users with several useful routines for many purposes, like generating webpages, processing CGI scripts, working with XML datafiles and net-connections. It also uses own variants of routines, that was invented first in the famous libraries and


If you don't have sufficient privileges to install in the Perl library directory, you can put into some convenient spot, such as your home directory, or in cgi-bin itself and prefix all Perl scripts that call it with something along the lines of the following preamble:

        use lib '/home/myname/perl/lib';
        use web;



This routine allows to set a filelock across NFS-boundaries. The common used perl-routine flock() fails at this point, so this routine is a useable alternative for bigger file-systems. It uses the modular functions link() and unlink() to mark a file locked. In addition to this, it also gives the locked file a counter: A file that is locked for more than $web::MAX_LOCKTIME seconds will be freed by the next process that calls NLock() on this file. A calling process gets either 0 or 1 as a return value, where 1 is returned if the file-locking was successful. 0 is returned only if the process waits for more than $web::MAX_WAITLOCK seconds or if symlink() fails.

Example 1:

        $filename = "data.txt";
        # do something
        close f1;

Example 2:

        use web;

        $stat= &NLock("");
        print "Lock: stat= $stat\n";
        $stat= &NLock("");
        print "Lock this file again: stat= $stat\n";
        sleep 8;
        $stat= &NLock("");
        print "Lock this file again: stat= $stat\n";
        $stat= &NUnlock("");
        print "Unlock: stat= $stat\n";


This routine removes the filelock that was set with NLock(). See NLock().


In using this command, you can remove all file-locks, that was set with NLock() and which wasn't removed before. It takes the list of file-locks out of the hash %web::lockliste.


This routine can be used to calculate a day's position within the year in days. It returns -1 if the argument is no date.


        $today = "$web::tag.$web::monat.$web::jahr" || "14.9.1999";
        $number_of_days = GetYearDay($today);
        print "Date: $today; It is the ${number_of_days}th day in this year.\n";


By using this routine you'll get the weekday of a given date, which is a number between 0 (for sunday) and 6 (for saturday). If the argument is wrong, -1 will be returned.


        $today = "$web::tag.$web::monat.$web::jahr" || "14.9.1999";
        $weekday = GetWeekDay($today);
        print "It is $web::wochentag[$weekday], $today.\n";


This function returns true, if the argument is a leapyear. If no argument is given, the current year is used.


        $this_year = 1999;
        if (isLeapYear($this_year)) {
          print "It's leapyear.\n";
        } else {
          print "No leapyear.\n";
        # Returns 'No leapyear.'


This is the opposite of the GetYearDay() routine. It calculates the date from a day's position within a year. It returns nothing if the argument is out of range [1..365].


        $num_of_yearday = 32;
        $date = GetDatebyYDay($num_of_yearday);
        print "The date is $date\n";
        # Returns 'The date is 1.2.1999', if $web::jahr = 1999.


Adds a number of days to a given date. Notice, that it works for adding only. Negative daynumbers might lead to errors in case of a number smaller than -365.


        $startdate = "1.11.1999";
        $modi_days = 119;
        $enddate = Add_Days_to_Date($startdate,$modi_days);
        print " $startdate + $modi_days Day(s) = $enddate\n";
        # Will return "28.2.2000".


Returns the number of seconds elapsed since midnight of a given time or 0 if the time format isn't valid (hour:minute:second).


        $jetztzeit = $web::stunde.":".$web::minute.":".$web::sek;
        $textzeit = "12:00:00";
        $diff_sekunden = abs(Get_Seconds($jetztzeit)-Get_Seconds($textzeit));
        print "Time differs with $diff_sekunden seconds.\n";


Returns the number of days that have passed by the inputvalue, which represend the number of a month.


        $month = 8;
        $passed_days = GetPassedDaysbyMonth($month);
        print "$passed_days days have passed, before the $month. month came\n";


Sometimes you need to get file names or other data from the internet. Due to the fact that you'll never know who can touch the data, you need to make sure that no one can send special chars which allow the execution of system commands. CERT gave out a set of characters that are harmless. They are set in the variable $web::OKCHARS as "a-z, A-Z, 0-9 _-.@/". This routine will check the argument for other characters and remove them from the string. That way, you can take filenames from the web without being afraid that someone else sends a dangerous string.


        $insecure_filename = $ENV{'QUERY_STRING'};
        $secure_filename = Check_Name($ENV{'QUERY_STRING'});
        if (length($secure_filename) != length($insecure_filename)) {
          print "The query-string contains invalid signs.";
        } else {
          open(f1,"<$secure_filename") || Fehlermeldung("File $secure_filename not found.");
          # do something
          close f1;

Using Check_Name(), query strings like "/tmp/something|+'/bin/term+-display+" won't work.


Returns the string "Content-type: text/html\n\n", if it wasn't returned before. Additionally it can reset cookies if there were some before on this domain or set new cookies by using a hash-reference. The additional parameters are:


           1            Activates the setting of cookies. If new cookies
                        are defined by argument 3, these will be set. Otherwise
                        the cookies as given by $ENV{'HTTP_COOKIES'} are
           2            On default, PrintHeader() will return nothing, if it
                        was called before. By setting this argument unlike 1
                        it will ignore previous calls.
           3            A hash-reference, which defines the cookies to be set.
           4            The path-value for the cookies. On default its set to
           5            The lifetime-value for cookies in days. On default its
                        set to 30.


Reads the query string and/or the standard input and returns them as a hash. If the content-type is marked as multipart, it allows file uploads as long the variable $web::allowuploads is true. In this case, the new file is stored under its name, or to be precise, what Check_Name() makes of its name.


        %in = ReadParse;
        print "<ul>\n";
        foreach $key (keys %in) {
          print "<li><b>$key</b>  &nbsp;  $in{$key}</li>\n";
        print "</ul>\n";


This routine can be used to print out error messages. It also replaces CgiDie() from In addition to the former CgiDie(), this routine can also take a layout file to produce a better designed output. It takes the error message, the error title and the file name of an optional layout file as arguments.

This layout file is a common HTML file, but it can contain the strings #ZEIT#, #ERRORTEXT# and #TITEL#. These strings will be replaced with the arguments. In using the global variable $web::errorlayout_file you can predefine a layout-file till the end of the program.

The routine checks for the environment variables HTTP_USER_AGENT and SERVER_NAME to see whether it was called from of a CGI script. If so, it also prints the content-type. To avoid file-locking problems, this routine also executes NUnlockAll.


        if (not (-r "hallo.html")) {
          Fehlermeldung("Die Datei hallo.html konnte nicht gelesen werden. 
          Bitte ueberpruefen Sie die Dateirechte.","Datei nicht lesbar");


Checks if the argument has a valid URL syntax. Returns true if the syntax is ok.


        $url = "";
        if (isURL($url)) {
          print "Valid URL: $url\n";


Checks if the argument's syntax is allowed for email addresses. Returns true if it looks ok. Notice that it doesn't check whether the email really exists!


        $mail = '';
        if (isMail($mail)) {
          print "Mail address $mail looks correct.\n";


Checks if the argument is a valid German date. The syntax for a date was set to: DD.MM.YYYY.


Checks the given argument for a valid IP-syntax. It returns TRUE on success. (This routine was invoked by Rolf Rost,


Checks if the argument is a valid time. The syntax of a time was set to: HH:MM:SS.


In Unix many people define configuration files in a way that variable names and arguments are divided by one or more tabs and comments are preceded by a '#'. Variable names start with the first char of a line.

This routine allows reading such a file and returns its content within a hash. Comments of variables are saved into the hash too, but with the string $web::PARACOMMENT_SIGN as appendix (Notice that comments here are put after the variables, not before).

If the file could not be read, the hash value 'status' is set to 400, otherwise it is set to 200.


        $configfile = "config";
        %CONFIG = Read_Parafile($configfile);
        if ($CONFIG{'status'}==400) {
          Fehlermeldung("Could not read the config file.");
        foreach $key (keys %CONFIG) {
          if (not ($key =~ /$web::PARACOMMENT_SIGN/i)) {
            print "$key \t $CONFIG{$key}\n";


Reads a file and returns its content in an array.


Returns everything between a given HTML flag.


        $text = "<b>Startseite</b>";
        $content = ReturnFlagContent("b",$text);
        print "$content\n";
        # Prints 'Startseite'


This function does two things: It replaces the string #TEXT# with a given string and sets a <a href=""></a> around every URL within the text. This routine was made mainly because a simple search and replace for s/#TEXT#/$newtext/gi needs a long time if $newtext contains linebreaks. Therefore, all linebreaks are first replaced with <_BR_>, then the text will be replaced and after this all <_BR_>'s are set to linebreaks again. It's a small and dirty trick, but it works.


        $text = "Here\n is\n something\n many\n lines.\n Insert here: #TEXT#\n\n";
        $insert = "This was inserted.";
        $text = ReplaceText($insert, $text);


This routine puts a line into a file together with the time and the IP/host which the script was executed on.


        WriteLog("debug.log","Files updated.");


This procedure was made as an additional search-procedure for textparsing. It will return the full sentence of a long text, if a the search-word is in it. Notice, that this function fails, if there are shortcuts of words and the sentence was defined as something between two dots.


        use web;
        $text = "It's an old story of a lost world, calling itself the
                Realm of Magic. Duncan Idaho, the famous warrior killed
                one elven maid too much. The mortals gathered and
                formed a powerful group to kill him. But then something
        $search = "Duncan";
        # Returns "Duncan Idaho, the famous warrior killed  
        #          one elven maid too much"


RemoveHTML() will remove all HTML-Tags and Specifications out of a given string.


        $asciitext = RemoveHTML($htmltext);


Returns a HTML head. Stolen out of Use with print(HtmlTop);


Returns the ending tags of a HTML-document. Stolen out of Use with print(HtmlBot);


Makes a redirection towards another URL.


        # will tell the server to set the location to the given url.


Copyright 1999-2000 Wolfgang Wiese. All rights reserved. It may be used and modified freely, but I do request that this copyright notice remain attached to the file. You may modify this module as you wish, but if you redistribute a modified version, please attach a note listing the modifications you have made.

Address bug reports and comments to:


Thanks very much to:

Johannes Schritz (
Gert Buettner (
Manfred Abel (
Rolf Rost (
syntax highlighting: