SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
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?

Contenu connexe

Tendances

This keyword and final keyword
This keyword and final  keywordThis keyword and final  keyword
This keyword and final keywordkinjalbirare
 
Pointers and call by value, reference, address in C
Pointers and call by value, reference, address in CPointers and call by value, reference, address in C
Pointers and call by value, reference, address in CSyed Mustafa
 
Structures and Pointers
Structures and PointersStructures and Pointers
Structures and PointersPrabu U
 
16 subroutine
16 subroutine16 subroutine
16 subroutinefyjordan9
 
Scope rules : local and global variables
Scope rules : local and global variablesScope rules : local and global variables
Scope rules : local and global variablessangrampatil81
 
Class and object in C++
Class and object in C++Class and object in C++
Class and object in C++rprajat007
 
Regular expression in javascript
Regular expression in javascriptRegular expression in javascript
Regular expression in javascriptToan Nguyen
 
Recursive Function
Recursive FunctionRecursive Function
Recursive FunctionHarsh Pathak
 
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
[OOP - Lec 16,17] Objects as Function Parameter and ReturnTypeMuhammad Hammad Waseem
 
PHP - DataType,Variable,Constant,Operators,Array,Include and require
PHP - DataType,Variable,Constant,Operators,Array,Include and requirePHP - DataType,Variable,Constant,Operators,Array,Include and require
PHP - DataType,Variable,Constant,Operators,Array,Include and requireTheCreativedev Blog
 

Tendances (20)

This keyword and final keyword
This keyword and final  keywordThis keyword and final  keyword
This keyword and final keyword
 
Unit 3. Input and Output
Unit 3. Input and OutputUnit 3. Input and Output
Unit 3. Input and Output
 
Pointers and call by value, reference, address in C
Pointers and call by value, reference, address in CPointers and call by value, reference, address in C
Pointers and call by value, reference, address in C
 
Constructors in C++
Constructors in C++Constructors in C++
Constructors in C++
 
Constructor and destructor
Constructor  and  destructor Constructor  and  destructor
Constructor and destructor
 
Structures and Pointers
Structures and PointersStructures and Pointers
Structures and Pointers
 
16 subroutine
16 subroutine16 subroutine
16 subroutine
 
Scope rules : local and global variables
Scope rules : local and global variablesScope rules : local and global variables
Scope rules : local and global variables
 
Chapter 07 inheritance
Chapter 07 inheritanceChapter 07 inheritance
Chapter 07 inheritance
 
Class and object in C++
Class and object in C++Class and object in C++
Class and object in C++
 
Regular expression in javascript
Regular expression in javascriptRegular expression in javascript
Regular expression in javascript
 
Recursive Function
Recursive FunctionRecursive Function
Recursive Function
 
Constructor ppt
Constructor pptConstructor ppt
Constructor ppt
 
String c
String cString c
String c
 
Subroutine
SubroutineSubroutine
Subroutine
 
Data types in C
Data types in CData types in C
Data types in C
 
C pointer
C pointerC pointer
C pointer
 
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
[OOP - Lec 16,17] Objects as Function Parameter and ReturnType
 
Inheritance in java
Inheritance in javaInheritance in java
Inheritance in java
 
PHP - DataType,Variable,Constant,Operators,Array,Include and require
PHP - DataType,Variable,Constant,Operators,Array,Include and requirePHP - DataType,Variable,Constant,Operators,Array,Include and require
PHP - DataType,Variable,Constant,Operators,Array,Include and require
 

Similaire à 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
 

Similaire à 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
 

Plus 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
 

Dernier

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 

Dernier (20)

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 

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;