SlideShare a Scribd company logo
Perl Programming
                 Course
                  Subroutines




Krassimir Berov

I-can.eu
Contents
1. What is a Subroutine
2. Defining Subroutines
3. Invoking Subroutines
4. Subroutine arguments
5. Retrieving data from calling subroutines
   Operator caller
6. Return values. Operator wantarray
7. Scope and Declarations
What is a Subroutine
• Subroutine
  • a user-defined function
  • identifier for a code block
    • letters, digits, and underscores
    • can't start with a digit
    • optional ampersand (&) in front
Defining a Subroutine
• sub NAME BLOCK
  sub NAME (PROTO) BLOCK
  sub NAME : ATTRS BLOCK
  sub NAME (PROTO) : ATTRS BLOCK
  • Without a BLOCK it's just a forward declaration
  • Without a NAME, it's an anonymous function
    declaration – return value: CODE ref
    See: perlfaq7/What's a closure?

  • May optionally have attribute lists
    See: attributes, Attribute::Handlers
  • A subroutine may be defined anywhere in your
    program
Defining a Subroutine
• sub NAME (PROTO) BLOCK
  • The function declaration must be visible at
    compile time
  • The prototype is in effect only when not using
    the & character
  • Method calls are not influenced by prototypes
    either
  • The intent is primarily to let you define
    subroutines that work like built-in functions
  • See:perlsub/Prototypes
Invoking Subroutines
• Example:sub.pl
  sub hope;
  sub syntax($) {
      print "This is 'Subroutines' slide "
          .($_[0]||1) ."n";
  }
  syntax $ARGV[0];
  #syntax();#Not enough arguments for...
  hope;
  hope();
  &hope;
  nope();
  #nope;#Bareword "nope" not allowed...
  sub hope { print "I hope you like Perl!n"; }
  sub nope { print "I am a dangerous Bareword.n" }
  my $code_ref = sub { print 'I am a closure'.$/ };
  print $code_ref,$/;#CODE(0x817094c)
  $code_ref->() or &$code_ref;
Subroutine arguments
• @_
  contains the parameters passed to the
  subroutine
• if you call a function with two arguments, they
  will be stored in $_[0] and $_[1]
• Avoid to use ($_[0] .. $_[n]) directly unless you
  want to modify the arguments.
• The array @_ is a local array, but its elements
  are aliases for the actual scalar parameters
Subroutine arguments
• Example: sub_args.pl
  use strict; use warnings; $ = $/;
  sub modify($) {
      print "The alias holding "
          .($_[0]++) ." will be modifyedn";
  }

  modify($ARGV[0]);
  print $ARGV[0];

  copy_arg($ARGV[0]);
  print $ARGV[0];

  sub copy_arg {
      my ($copy) = @_;
      print "The copy holding "
          .($copy++) ." will NOT modify $ARGV[0]n";
  }
Retrieving data from
              calling subroutines
• caller EXPR
  caller
 Returns the context of the current subroutine call.
  • In scalar context, returns the caller's package name if
    there is a caller and the undefined value otherwise.
  • In list context, returns
    ($package, $filename, $line) = caller;
  • In list context with EXPR, returns more...
  • The value of EXPR indicates how many call frames to
    go back before the current one.
Retrieving data from
              calling subroutines
• Example:caller.pl
  use Data::Dumper;
  sub dump_stacktrace {
      print shift || 'Dumping stacktrace:';
      my $call_frame = 1;
      local $,=$/;
      my %i;
      while(($i{package}, $i{filename}, $i{line},
             $i{subroutine}, $i{hasargs}, $i{wantarray},
             $i{evaltext}, $i{is_require}, $i{hints},
             $i{bitmask}, $i{hinthash})
             = caller($call_frame++)){
          print Data::Dumper->Dump(
              [%i],['call '.($call_frame-1)]
          );
      }
  }
Retrieving data from
              calling subroutines                    (2)
• Example: caller2.pl
  package Calling;
  require 'caller.pl';
  run(@ARGV);
  sub run {
      print '"run" called';
      OtherPackage::second(shift);
  }

  sub OtherPackage::second {
      print '"second" called';
      my@a = ThirdPackage::third(@_);
  }

  sub ThirdPackage::third {
      print '"third" called';
      dump_stacktrace('This is the stack trace:');
  }
Return values.
            Operator wantarray
• Return values
  • (list, scalar, or void) depending on the
    context of the subroutine call
  • If you specify no return value:
    • returns an empty list in list context,
    • the undefined value in scalar context,
    • nothing in void context.
  • If you return one or more lists:
    • these will be flattened together
Return values.
            Operator wantarray                 (2)
• Return values
  • A return statement may be used to
    specify a return value
  • The last evaluated statement becomes
    automatically the return value
  • If the last statement is a foreach or a
    while, the returned value is unspecified
  • The empty sub returns the empty list
Return values.
              Operator wantarray
• Return values: return.pl
  #prints favorite pet or a list of all pets
  my @pets = qw|Goldy Amelia Jako|;

  print run($ARGV[0]);
  sub run {
      my $pref = shift||'';#favorite or list of pets
      if($pref) { favorite() }
      else       { local $,=$/; print pets() }
  }
  sub favorite {
      'favorite:'.$pets[1]
  }
  sub pets {
      return ('all pets:', @pets)
  }
Return values.
            Operator wantarray
• wantarray
  • Returns true if the context of the currently
    executing subroutine or eval is looking for
    a list value
  • Returns false if the context is looking for a
    scalar.
  • Returns the undefined value if the context
    is looking for no value (void context).
Return values.
                Operator wantarray
• wantarray
  # prints favorite pet or a list of all pets,
  # or nothing depending on context
  my @pets = qw|Goldy Amelia Jako|;
  run();

  sub run {
      if(defined $ARGV[0]) {
          if($ARGV[0]==1)    { my $favorite = pets() }
          elsif($ARGV[0]==2) { my @pets = pets()     }
      }
      else { pets() }
  }

  sub pets {
      local $,=$/ and print ('all pets:', @pets) if wantarray;
      return if not defined wantarray;
      print 'favorite:'.$pets[1] if not wantarray;
  }
Scope and Declarations
• Variable scoping, private variables.
• Scope declarations: my, local, our
Scope
• What is scope?
  • Lexical/static scope can be defined by
    • the boundary of a file
    • any block – {}
    • a subroutine
    • an eval
    • using my
  • Global/package/dynamic scope can be defined
    by using sub, our and local declarations
    respectively
Declarations
• my - declare and assign a local variable
  (lexical scoping)
• our - declare and assign a package
  variable (lexical scoping)
• local - create a temporary value for a
  global variable (dynamic scoping)
Declarations
• my $var;
  A my declares the listed variables to be local
  (lexically) to the enclosing block, file, or eval.
• If more than one value is listed, the list must be
  placed in parentheses.
• a virable declared via my is private
• See: perlfunc/my, perlsub/Private Variables via my()
  my $dog;           #declare $dog lexically local
  my (@cats, %dogs); #declare list of variables local
  my $fish = "bob"; #declare $fish lexical, and init it
  my @things = ('fish','cat');
  #declare @things lexical, and init it
Declarations
• my $var;
  Example:
 my $dog = 'Puffy';
 {
     my $dog = 'Betty';
     print 'My dog is named ' . $dog;
 }
 print 'My dog is named ' . $dog;
 my ($fish, $cat, $parrot) = qw|Goldy Amelia Jako|;
 print $fish, $cat, $parrot;
 #print $lizard;
 #Global symbol "$lizard" requires explicit package
 name...
Declarations
• our EXPR
  • associates a simple name with a package
    variable in the current package
  • can be used within the current scope
    without prefixing it with package name
  • can be used outside the current package
    by prefixing it with the package name
Declarations
• our – Example:
  {
      package GoodDogs;
      print 'We are in package ' . __PACKAGE__;
      our $dog = 'Puffy';
      {
          print 'Our dog is named ' . $dog;
          my $dog = 'Betty';
          print 'My dog is named ' . $dog;
      }
      print 'My dog is named ' . $dog;
  }{#delete this line and experiment
      package BadDogs;
      print $/.'We are in package ' . __PACKAGE__;
      #print 'Previous dog is named ' . $dog;
      print 'Your dog is named ' . $GoodDogs::dog;
      our $dog = 'Bobby';
      print 'Our dog is named ' . $dog;
  }
Declarations
• local EXPR
  • modifies the listed variables to be local to the
    enclosing block, file, or eval
  • If more than one value is listed, the list must
    be placed in parentheses
Declarations
• local EXPR                                             (2)

 WARNING:
  • prefer my instead of local – it's faster and safer
  • exceptions are:
     • global punctuation variables
     • global filehandles and formats
     • direct manipulation of the Perl symbol table itself
  • local is mostly used when the current value of a
    variable must be visible to called subroutines
Declarations
• local – Example:
  use English;
  {
      local $^O = 'Win32';
      local $OUTPUT_RECORD_SEPARATOR = "n-----n";#$
      local $OUTPUT_FIELD_SEPARATOR = ': ';#$,
      print 'We run on', $OSNAME;

      open my $fh, $PROGRAM_NAME or die $OS_ERROR;#$0 $!
      local $INPUT_RECORD_SEPARATOR ; #$/ enable
  localized slurp mode
      my $content = <$fh>;
      close $fh;
      print $content;
      #my $^O = 'Solaris';#Can't use global $^O in
  "my"...
  }
  print 'We run on ', $OSNAME;
Subroutines




Questions?

More Related Content

PPTX
Lexical analyzer generator lex
PPTX
COMPILER DESIGN
PPTX
Intermediate code generator
PPTX
Lexical Analysis - Compiler Design
PDF
08 subprograms
PDF
R programming groundup-basic-section-i
PDF
Control Flow Graphs
PPTX
Syntax Analysis in Compiler Design
Lexical analyzer generator lex
COMPILER DESIGN
Intermediate code generator
Lexical Analysis - Compiler Design
08 subprograms
R programming groundup-basic-section-i
Control Flow Graphs
Syntax Analysis in Compiler Design

What's hot (20)

PPTX
Top down parsing
PPT
Bottom - Up Parsing
PPTX
Quick sort
PPTX
Semantics analysis
PPTX
Compiler Design Unit 4
PPTX
Managing input and output operations in c
PPTX
Automata theory -RE to NFA-ε
PPTX
Finite Automata: Deterministic And Non-deterministic Finite Automaton (DFA)
PPTX
Python comments and variables.pptx
PPTX
LR(1) and SLR(1) parsing
PPTX
The Phases of a Compiler
PPTX
Type checking in compiler design
PPTX
Branching statements
PDF
Bottom up parser
PPTX
Threaded Binary Tree.pptx
PPTX
Compiler design syntax analysis
PPT
Divide and conquer
PPTX
Directed Acyclic Graph Representation of basic blocks
PDF
Deterministic Finite Automata (DFA)
PPT
C++: Constructor, Copy Constructor and Assignment operator
Top down parsing
Bottom - Up Parsing
Quick sort
Semantics analysis
Compiler Design Unit 4
Managing input and output operations in c
Automata theory -RE to NFA-ε
Finite Automata: Deterministic And Non-deterministic Finite Automaton (DFA)
Python comments and variables.pptx
LR(1) and SLR(1) parsing
The Phases of a Compiler
Type checking in compiler design
Branching statements
Bottom up parser
Threaded Binary Tree.pptx
Compiler design syntax analysis
Divide and conquer
Directed Acyclic Graph Representation of basic blocks
Deterministic Finite Automata (DFA)
C++: Constructor, Copy Constructor and Assignment operator
Ad

Similar to Subroutines (20)

KEY
Good Evils In Perl (Yapc Asia)
PDF
Scripting3
PDF
BSDM with BASH: Command Interpolation
PDF
SPL: The Missing Link in Development
PDF
Marc’s (bio)perl course
ODP
Programming in perl style
PDF
php AND MYSQL _ppt.pdf
PDF
Php Tutorials for Beginners
PDF
What's New in Perl? v5.10 - v5.16
PPTX
PHPneweeeeeeeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Dades i operadors
PDF
Introduction to Perl
PDF
Perl Bag of Tricks - Baltimore Perl mongers
KEY
Can't Miss Features of PHP 5.3 and 5.4
PDF
Practical PHP 5.3
PPTX
Introduction in php part 2
ODP
Advanced Perl Techniques
PDF
Practical approach to perl day1
PDF
PHP Tips & Tricks
Good Evils In Perl (Yapc Asia)
Scripting3
BSDM with BASH: Command Interpolation
SPL: The Missing Link in Development
Marc’s (bio)perl course
Programming in perl style
php AND MYSQL _ppt.pdf
Php Tutorials for Beginners
What's New in Perl? v5.10 - v5.16
PHPneweeeeeeeeeeeeeeeeeeeeeeeeeeeeee.pptx
Dades i operadors
Introduction to Perl
Perl Bag of Tricks - Baltimore Perl mongers
Can't Miss Features of PHP 5.3 and 5.4
Practical PHP 5.3
Introduction in php part 2
Advanced Perl Techniques
Practical approach to perl day1
PHP Tips & Tricks
Ad

More from Krasimir Berov (Красимир Беров) (14)

Recently uploaded (20)

PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
cuic standard and advanced reporting.pdf
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Encapsulation theory and applications.pdf
PPTX
Cloud computing and distributed systems.
PPT
Teaching material agriculture food technology
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Machine learning based COVID-19 study performance prediction
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Diabetes mellitus diagnosis method based random forest with bat algorithm
Spectral efficient network and resource selection model in 5G networks
cuic standard and advanced reporting.pdf
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
MYSQL Presentation for SQL database connectivity
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Review of recent advances in non-invasive hemoglobin estimation
Digital-Transformation-Roadmap-for-Companies.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Encapsulation theory and applications.pdf
Cloud computing and distributed systems.
Teaching material agriculture food technology
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Machine learning based COVID-19 study performance prediction
Building Integrated photovoltaic BIPV_UPV.pdf
Agricultural_Statistics_at_a_Glance_2022_0.pdf

Subroutines

  • 1. Perl Programming Course Subroutines Krassimir Berov I-can.eu
  • 2. Contents 1. What is a Subroutine 2. Defining Subroutines 3. Invoking Subroutines 4. Subroutine arguments 5. Retrieving data from calling subroutines Operator caller 6. Return values. Operator wantarray 7. Scope and Declarations
  • 3. What is a Subroutine • Subroutine • a user-defined function • identifier for a code block • letters, digits, and underscores • can't start with a digit • optional ampersand (&) in front
  • 4. Defining a Subroutine • sub NAME BLOCK sub NAME (PROTO) BLOCK sub NAME : ATTRS BLOCK sub NAME (PROTO) : ATTRS BLOCK • Without a BLOCK it's just a forward declaration • Without a NAME, it's an anonymous function declaration – return value: CODE ref See: perlfaq7/What's a closure? • May optionally have attribute lists See: attributes, Attribute::Handlers • A subroutine may be defined anywhere in your program
  • 5. Defining a Subroutine • sub NAME (PROTO) BLOCK • The function declaration must be visible at compile time • The prototype is in effect only when not using the & character • Method calls are not influenced by prototypes either • The intent is primarily to let you define subroutines that work like built-in functions • See:perlsub/Prototypes
  • 6. Invoking Subroutines • Example:sub.pl sub hope; sub syntax($) { print "This is 'Subroutines' slide " .($_[0]||1) ."n"; } syntax $ARGV[0]; #syntax();#Not enough arguments for... hope; hope(); &hope; nope(); #nope;#Bareword "nope" not allowed... sub hope { print "I hope you like Perl!n"; } sub nope { print "I am a dangerous Bareword.n" } my $code_ref = sub { print 'I am a closure'.$/ }; print $code_ref,$/;#CODE(0x817094c) $code_ref->() or &$code_ref;
  • 7. Subroutine arguments • @_ contains the parameters passed to the subroutine • if you call a function with two arguments, they will be stored in $_[0] and $_[1] • Avoid to use ($_[0] .. $_[n]) directly unless you want to modify the arguments. • The array @_ is a local array, but its elements are aliases for the actual scalar parameters
  • 8. Subroutine arguments • Example: sub_args.pl use strict; use warnings; $ = $/; sub modify($) { print "The alias holding " .($_[0]++) ." will be modifyedn"; } modify($ARGV[0]); print $ARGV[0]; copy_arg($ARGV[0]); print $ARGV[0]; sub copy_arg { my ($copy) = @_; print "The copy holding " .($copy++) ." will NOT modify $ARGV[0]n"; }
  • 9. Retrieving data from calling subroutines • caller EXPR caller Returns the context of the current subroutine call. • In scalar context, returns the caller's package name if there is a caller and the undefined value otherwise. • In list context, returns ($package, $filename, $line) = caller; • In list context with EXPR, returns more... • The value of EXPR indicates how many call frames to go back before the current one.
  • 10. Retrieving data from calling subroutines • Example:caller.pl use Data::Dumper; sub dump_stacktrace { print shift || 'Dumping stacktrace:'; my $call_frame = 1; local $,=$/; my %i; while(($i{package}, $i{filename}, $i{line}, $i{subroutine}, $i{hasargs}, $i{wantarray}, $i{evaltext}, $i{is_require}, $i{hints}, $i{bitmask}, $i{hinthash}) = caller($call_frame++)){ print Data::Dumper->Dump( [%i],['call '.($call_frame-1)] ); } }
  • 11. Retrieving data from calling subroutines (2) • Example: caller2.pl package Calling; require 'caller.pl'; run(@ARGV); sub run { print '"run" called'; OtherPackage::second(shift); } sub OtherPackage::second { print '"second" called'; my@a = ThirdPackage::third(@_); } sub ThirdPackage::third { print '"third" called'; dump_stacktrace('This is the stack trace:'); }
  • 12. Return values. Operator wantarray • Return values • (list, scalar, or void) depending on the context of the subroutine call • If you specify no return value: • returns an empty list in list context, • the undefined value in scalar context, • nothing in void context. • If you return one or more lists: • these will be flattened together
  • 13. Return values. Operator wantarray (2) • Return values • A return statement may be used to specify a return value • The last evaluated statement becomes automatically the return value • If the last statement is a foreach or a while, the returned value is unspecified • The empty sub returns the empty list
  • 14. Return values. Operator wantarray • Return values: return.pl #prints favorite pet or a list of all pets my @pets = qw|Goldy Amelia Jako|; print run($ARGV[0]); sub run { my $pref = shift||'';#favorite or list of pets if($pref) { favorite() } else { local $,=$/; print pets() } } sub favorite { 'favorite:'.$pets[1] } sub pets { return ('all pets:', @pets) }
  • 15. Return values. Operator wantarray • wantarray • Returns true if the context of the currently executing subroutine or eval is looking for a list value • Returns false if the context is looking for a scalar. • Returns the undefined value if the context is looking for no value (void context).
  • 16. Return values. Operator wantarray • wantarray # prints favorite pet or a list of all pets, # or nothing depending on context my @pets = qw|Goldy Amelia Jako|; run(); sub run { if(defined $ARGV[0]) { if($ARGV[0]==1) { my $favorite = pets() } elsif($ARGV[0]==2) { my @pets = pets() } } else { pets() } } sub pets { local $,=$/ and print ('all pets:', @pets) if wantarray; return if not defined wantarray; print 'favorite:'.$pets[1] if not wantarray; }
  • 17. Scope and Declarations • Variable scoping, private variables. • Scope declarations: my, local, our
  • 18. Scope • What is scope? • Lexical/static scope can be defined by • the boundary of a file • any block – {} • a subroutine • an eval • using my • Global/package/dynamic scope can be defined by using sub, our and local declarations respectively
  • 19. Declarations • my - declare and assign a local variable (lexical scoping) • our - declare and assign a package variable (lexical scoping) • local - create a temporary value for a global variable (dynamic scoping)
  • 20. Declarations • my $var; A my declares the listed variables to be local (lexically) to the enclosing block, file, or eval. • If more than one value is listed, the list must be placed in parentheses. • a virable declared via my is private • See: perlfunc/my, perlsub/Private Variables via my() my $dog; #declare $dog lexically local my (@cats, %dogs); #declare list of variables local my $fish = "bob"; #declare $fish lexical, and init it my @things = ('fish','cat'); #declare @things lexical, and init it
  • 21. Declarations • my $var; Example: my $dog = 'Puffy'; { my $dog = 'Betty'; print 'My dog is named ' . $dog; } print 'My dog is named ' . $dog; my ($fish, $cat, $parrot) = qw|Goldy Amelia Jako|; print $fish, $cat, $parrot; #print $lizard; #Global symbol "$lizard" requires explicit package name...
  • 22. Declarations • our EXPR • associates a simple name with a package variable in the current package • can be used within the current scope without prefixing it with package name • can be used outside the current package by prefixing it with the package name
  • 23. Declarations • our – Example: { package GoodDogs; print 'We are in package ' . __PACKAGE__; our $dog = 'Puffy'; { print 'Our dog is named ' . $dog; my $dog = 'Betty'; print 'My dog is named ' . $dog; } print 'My dog is named ' . $dog; }{#delete this line and experiment package BadDogs; print $/.'We are in package ' . __PACKAGE__; #print 'Previous dog is named ' . $dog; print 'Your dog is named ' . $GoodDogs::dog; our $dog = 'Bobby'; print 'Our dog is named ' . $dog; }
  • 24. Declarations • local EXPR • modifies the listed variables to be local to the enclosing block, file, or eval • If more than one value is listed, the list must be placed in parentheses
  • 25. Declarations • local EXPR (2) WARNING: • prefer my instead of local – it's faster and safer • exceptions are: • global punctuation variables • global filehandles and formats • direct manipulation of the Perl symbol table itself • local is mostly used when the current value of a variable must be visible to called subroutines
  • 26. Declarations • local – Example: use English; { local $^O = 'Win32'; local $OUTPUT_RECORD_SEPARATOR = "n-----n";#$ local $OUTPUT_FIELD_SEPARATOR = ': ';#$, print 'We run on', $OSNAME; open my $fh, $PROGRAM_NAME or die $OS_ERROR;#$0 $! local $INPUT_RECORD_SEPARATOR ; #$/ enable localized slurp mode my $content = <$fh>; close $fh; print $content; #my $^O = 'Solaris';#Can't use global $^O in "my"... } print 'We run on ', $OSNAME;