SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler offline
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?

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Basics of c++ Programming Language
Basics of c++ Programming LanguageBasics of c++ Programming Language
Basics of c++ Programming Language
 
Stack application
Stack applicationStack application
Stack application
 
Arrays in c
Arrays in cArrays in c
Arrays in c
 
Two dimensional array
Two dimensional arrayTwo dimensional array
Two dimensional array
 
Strings in c++
Strings in c++Strings in c++
Strings in c++
 
Python unit 2 as per Anna university syllabus
Python unit 2 as per Anna university syllabusPython unit 2 as per Anna university syllabus
Python unit 2 as per Anna university syllabus
 
Stack & Queue using Linked List in Data Structure
Stack & Queue using Linked List in Data StructureStack & Queue using Linked List in Data Structure
Stack & Queue using Linked List in Data Structure
 
Dynamic memory allocation in c
Dynamic memory allocation in cDynamic memory allocation in c
Dynamic memory allocation in c
 
Memory allocation in c
Memory allocation in cMemory allocation in c
Memory allocation in c
 
Java Streams
Java StreamsJava Streams
Java Streams
 
Specification-of-tokens
Specification-of-tokensSpecification-of-tokens
Specification-of-tokens
 
Method overloading
Method overloadingMethod overloading
Method overloading
 
ITFT-Constants, variables and data types in java
ITFT-Constants, variables and data types in javaITFT-Constants, variables and data types in java
ITFT-Constants, variables and data types in java
 
Python functions
Python functionsPython functions
Python functions
 
MYSQL - PHP Database Connectivity
MYSQL - PHP Database ConnectivityMYSQL - PHP Database Connectivity
MYSQL - PHP Database Connectivity
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
Inheritance in java
Inheritance in javaInheritance in java
Inheritance in java
 
Loops in C Programming Language
Loops in C Programming LanguageLoops in C Programming Language
Loops in C Programming Language
 
Data structures using c
Data structures using cData structures using c
Data structures using c
 
Operators in java
Operators in javaOperators in java
Operators in java
 

Semelhante a Subroutines

Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Kang-min Liu
 
Scripting3
Scripting3Scripting3
Scripting3Nao Dara
 
BSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationBSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationWorkhorse Computing
 
SPL: The Missing Link in Development
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Developmentjsmith92
 
Marc’s (bio)perl course
Marc’s (bio)perl courseMarc’s (bio)perl course
Marc’s (bio)perl courseMarc Logghe
 
Programming in perl style
Programming in perl styleProgramming in perl style
Programming in perl styleBo Hua Yang
 
What's New in Perl? v5.10 - v5.16
What's New in Perl?  v5.10 - v5.16What's New in Perl?  v5.10 - v5.16
What's New in Perl? v5.10 - v5.16Ricardo Signes
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perlworr1244
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongersbrian d foy
 
Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4Jeff Carouth
 
Practical PHP 5.3
Practical PHP 5.3Practical PHP 5.3
Practical PHP 5.3Nate Abele
 
Advanced Perl Techniques
Advanced Perl TechniquesAdvanced Perl Techniques
Advanced Perl TechniquesDave Cross
 
Practical approach to perl day1
Practical approach to perl day1Practical approach to perl day1
Practical approach to perl day1Rakesh Mukundan
 
Zend Certification Preparation Tutorial
Zend Certification Preparation TutorialZend Certification Preparation Tutorial
Zend Certification Preparation TutorialLorna Mitchell
 

Semelhante a Subroutines (20)

Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
Scripting3
Scripting3Scripting3
Scripting3
 
Syntax
SyntaxSyntax
Syntax
 
BSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationBSDM with BASH: Command Interpolation
BSDM with BASH: Command Interpolation
 
SPL: The Missing Link in Development
SPL: The Missing Link in DevelopmentSPL: The Missing Link in Development
SPL: The Missing Link in Development
 
Marc’s (bio)perl course
Marc’s (bio)perl courseMarc’s (bio)perl course
Marc’s (bio)perl course
 
Programming in perl style
Programming in perl styleProgramming in perl style
Programming in perl style
 
php AND MYSQL _ppt.pdf
php AND MYSQL _ppt.pdfphp AND MYSQL _ppt.pdf
php AND MYSQL _ppt.pdf
 
Php Tutorials for Beginners
Php Tutorials for BeginnersPhp Tutorials for Beginners
Php Tutorials for Beginners
 
What's New in Perl? v5.10 - v5.16
What's New in Perl?  v5.10 - v5.16What's New in Perl?  v5.10 - v5.16
What's New in Perl? v5.10 - v5.16
 
Dades i operadors
Dades i operadorsDades i operadors
Dades i operadors
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongers
 
Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4
 
Practical PHP 5.3
Practical PHP 5.3Practical PHP 5.3
Practical PHP 5.3
 
Introduction in php part 2
Introduction in php part 2Introduction in php part 2
Introduction in php part 2
 
Advanced Perl Techniques
Advanced Perl TechniquesAdvanced Perl Techniques
Advanced Perl Techniques
 
Practical approach to perl day1
Practical approach to perl day1Practical approach to perl day1
Practical approach to perl day1
 
PHP Tips & Tricks
PHP Tips & TricksPHP Tips & Tricks
PHP Tips & Tricks
 
Zend Certification Preparation Tutorial
Zend Certification Preparation TutorialZend Certification Preparation Tutorial
Zend Certification Preparation Tutorial
 

Mais de Krasimir Berov (Красимир Беров) (14)

Хешове
ХешовеХешове
Хешове
 
Списъци и масиви
Списъци и масивиСписъци и масиви
Списъци и масиви
 
Скаларни типове данни
Скаларни типове данниСкаларни типове данни
Скаларни типове данни
 
Въведение в Perl
Въведение в PerlВъведение в Perl
Въведение в Perl
 
System Programming and Administration
System Programming and AdministrationSystem Programming and Administration
System Programming and Administration
 
Network programming
Network programmingNetwork programming
Network programming
 
Processes and threads
Processes and threadsProcesses and threads
Processes and threads
 
Working with databases
Working with databasesWorking with databases
Working with databases
 
Working with text, Regular expressions
Working with text, Regular expressionsWorking with text, Regular expressions
Working with text, Regular expressions
 
IO Streams, Files and Directories
IO Streams, Files and DirectoriesIO Streams, Files and Directories
IO Streams, Files and Directories
 
Hashes
HashesHashes
Hashes
 
Lists and arrays
Lists and arraysLists and arrays
Lists and arrays
 
Scalar data types
Scalar data typesScalar data types
Scalar data types
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 

Último

Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 

Último (20)

Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.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;