ITNW 2310 - PERL
Allan Kochis,Adjunct Professor - CIT

Functions aka subroutines


  1. Named and default arguments
    PerlOutput
    #!/usr/bin/perl
    #
    #
    #  Named and default parameters
    #
    sub area {
        %args=@_;
        my($length,$width,$area);
        $length=$args{"length"} ? $args{"length"} : 20;
        $width=$args{"width"} ? $args{"width"} : 20;
        print "_" x 20 ."\n";
        print "Length = ".$length."\n";
        print "Width  = ".$width."\n";
        print "Area   = ".$length*$width."\n";
        print "_" x 20 ."\n";
    }
    
    area();
    area("length",30);
    area(width=>50);
    area(lenght=>100,width=>34);
    area("width",56,"length",67);
    
    
    

    ____________________
    Length = 20
    Width  = 20
    Area   = 400
    ____________________
    ____________________
    Length = 30
    Width  = 20
    Area   = 600
    ____________________
    ____________________
    Length = 20
    Width  = 50
    Area   = 1000
    ____________________
    ____________________
    Length = 20
    Width  = 34
    Area   = 680
    ____________________
    ____________________
    Length = 67
    Width  = 56
    Area   = 3752
    ____________________
    

  2. Multiple Requires
    PerlOutput
    #!/usr/bin/perl -w
    
    require 'sub7a.pl';
    require 'sub7b.pl';
    
    print "------------------------------\n";
    print ` cat sub7a.pl`;
    print "------------------------------\n";
    print `cat sub7b.pl`;
    print "------------------------------\n";
    
    $var=7;
    
    print addtwo($var)."\n";
    
    print addthree($var)."\n";
    

    ------------------------------
    #!/usr/bin/perl -w
    require "sub7b.pl";
    
    sub addtwo {
      my $var=$_[0];
      $var+=2;
      return $var;
    }
    
    #
    # always include this
    #
    1;
    ------------------------------
    #!/usr/bin/perl -w
    
    
    sub addthree {
     my $var=$_[0];
      $var+=3;
      return $var;
    }
    #
    # always include this
    #
    1;
    ------------------------------
    9
    10
    

  3. Lexical Collisions
    PerlOutput
    #!/usr/bin/perl -w
    
    require 'sub8.pl';
    
    print "------------------------------\n";
    print ` cat sub8.pl`;
    print "------------------------------\n";
    
    $var=7;
    
    print addtwo($var)."\n";
    
    print addthree($var)."\n";
    

    ------------------------------
    #!/usr/bin/perl -w
    
    sub addtwo {
      $var=$_[0];
      $var+=2;
      return $var;
    }
    
    sub addthree {
      $var=$_[0];
      $var+=3;
      return $var;
    }
    #
    # always include this
    #
    1;
    ------------------------------
    9
    12
    

  4. Packages
    PerlOutput
    #!/usr/bin/perl -w
    
    require 'sub9.pl';
    
    sub addtwo {
       my $var=$_[0];
       $var--;
    }
    print "------------------------------\n";
    print ` cat sub9.pl`;
    print "------------------------------\n";
    
    $var=7;
    
    print perly::addtwo($var)."\n";
    
    print perly::addthree($var)."\n";
     
    print addtwo($var)."\n";
    

    ------------------------------
    #!/usr/bin/perl -w
    package perly;
    sub addtwo {
      $var=$_[0];
      $var+=2;
      return $var;
    }
    
    sub addthree {
      $var=$_[0];
      $var+=3;
      return $var;
    }
    #
    # always include this
    #
    1;
    ------------------------------
    9
    10
    7
    

  5. System Functions
    PerlOutput
    #!/usr/bin/perl -w
    #
    #
    #  Read /etc/passwd
    #
    setpwent; # start lookup
    
    while(@pw=getpwent) {
    #
    #  returns ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell)
    #
        print $pw[6]."\t".$pw[0]."\n" if ($pw[6]);
    }
    
    endpwent;
    

    root    root
    bin     bin
    daemon  daemon
    adm     adm
    lp      lp
    sync    sync
    shutdown        shutdown
    halt    halt
    mail    mail
    news    news
    uucp    uucp
    operator        operator
    games   games
    gopher  gopher
    FTP User        ftp
    Nobody  nobody
    virtual console memory owner    vcsa
    NSCD Daemon     nscd
    Privilege-separated SSH sshd
    Portmapper RPC user     rpc
    RPC Service User        rpcuser
    Anonymous NFS User      nfsnobody
    Apache  apache
    X Font Server   xfs
    Named   named
    desktop desktop
    Allan Kochis    kochis
    Jeremy Stockman,,512-682-7631,512-291-0114      ps3167901
    Tommy Heaney,ITNW 2310,T&TH 705,512-635-3942    ps3167904
    Montgomery Conner,,,(512) 659-9367      ps3167907
    Aaron Rivas     ps3167908
    Arturo F. Dominguez     ps3167911
    Charles Egner,null,null,512-589-5927    ps3167913
    Andrew McDonald,5126448494,5126448494   ps3167916
    


    PerlOutput
    #!/usr/bin/perl
    #
    #
    #  Read /etc/group
    #
    setgrent; # start lookup
    $governor=0;
    while(($name,$pw,$gid,$members)=getgrent) {
        print $name."\n";
        last if ($governor++ > 10);
    }
    
    endgrent;
    

    root
    bin
    daemon
    sys
    adm
    tty
    disk
    lp
    mem
    kmem
    wheel
    mail
    

    PerlOutput
    #!/usr/bin/perl
    #
    #
    #  login
    #
    $whoami=getlogin;
    
    print $whoami."\n";
    
    

    kochis
    


    PerlOutput
    #!/usr/bin/perl
    #
    #
    #  timing
    #
    sub timer {
        print "-" x 20 ."\n";
        ($user,$system,$cuser,$csystem)=times;
        print $user."\n";
        print $system."\n";
        print "-" x 20 ."\n";
    }
    
    &timer;
    for($outer=0;$outer
    
    --------------------
    0
    0
    --------------------
    --------------------
    27.93
    127.67
    --------------------
    

  6. Function names
    PerlOutput
    #!/usr/bin/perl
    #
    #
    #  Where am I?
    #
    # ($package,$filename,$line,$subr,$has_args,$wantarray)
    #
    sub f1 {
       $a=(caller(0))[3];
       print "I am in function ".$a."\n";
    }
    sub f2 {
       $a=(caller(0))[3];
       print "I am in function ".$a."\n";
    }
    sub f3 {
       $a=(caller(0))[3];
       print "I am in function ".$a."\n";
    }
    sub f4 {
       $a=(caller(0))[3];
       print "I am in function ".$a."\n";
    }
    sub f5 {
       $a=(caller(0))[3];
       print "I am in function ".$a."\n";
    }
    f1();
    f3();
    f5();
    f4();
    f2();
    

    I am in function main::f1
    I am in function main::f3
    I am in function main::f5
    I am in function main::f4
    I am in function main::f2
    

© Allan Kochis Last revision 10/6/2005