day 5 subroutines
play

Day 5: Subroutines Suggested reading: Learning Perl (4th Ed.) - PowerPoint PPT Presentation

Computer Sciences 368 Introduction to Perl Day 5: Subroutines Suggested reading: Learning Perl (4th Ed.) Chapter 4, Subroutines 2012 Summer Cartwright 1 Computer Sciences 368 Introduction to Perl Turn In Homework 2012 Summer Cartwright 2


  1. Computer Sciences 368 Introduction to Perl Day 5: Subroutines Suggested reading: Learning Perl (4th Ed.) Chapter 4, Subroutines 2012 Summer Cartwright 1

  2. Computer Sciences 368 Introduction to Perl Turn In Homework 2012 Summer Cartwright 2

  3. Computer Sciences 368 Introduction to Perl Homework #3 Comments: Where to Define Variables? 2012 Summer Cartwright 3

  4. Computer Sciences 368 Introduction to Perl #!/usr/bin/perl use strict; use warnings; my %groceries; my $total = 0; my $item; my $count; my $average; while (1) { # ... } 2012 Summer Cartwright 4

  5. Computer Sciences 368 Introduction to Perl #!/usr/bin/perl use strict; use warnings; my %groceries; # no initial value while (1) { my $total = 0; foreach my $item (keys %groceries) { $total += $groceries{$item}; } my $count = scalar(keys %groceries); my $average = $total / $count; } 2012 Summer Cartwright 5

  6. Computer Sciences 368 Introduction to Perl Homework Review 2012 Summer Cartwright 6

  7. Computer Sciences 368 Introduction to Perl Background 2012 Summer Cartwright 7

  8. Computer Sciences 368 Scripting for CHTC The Problem my $sum = 0; my $count = 0; while (my $temp_c = <INPUT_FILE>) { my $temp_f = ($temp_c * 9 / 5) + 32; print "Temp: $temp_f F\n"; $sum += $temp_c; $count += 1; } my $avg_c = $sum / $count; my $avg_f = ($avg_c * 9 / 5) + 32; 2012 Spring Cartwright 8

  9. Computer Sciences 368 Introduction to Perl Don’t Repeat Yourself (DRY) • Code • Data • Configuration • Documentation Hunt & Thomas (1999), The Pragmatic Programmer 2012 Summer Cartwright 9

  10. Computer Sciences 368 Introduction to Perl E. W. Dijkstra (1968) Go to statement considered harmful Communications of the ACM, 11, 147–148 2012 Summer Cartwright 10

  11. Computer Sciences 368 Scripting for CHTC Solution: Procedures • Also called: subroutines, functions, methods, … • Organize (some) code into “chunks” – Maximize code reuse / minimize repetition – Organize code clearly (decomposition) – Make testable units of code • Like a script within a script – Consists of Perl statements – Accepts input – Can give back output – Has its own state (i.e., variables) 2012 Spring Cartwright 11

  12. Computer Sciences 368 Introduction to Perl Subroutines 2012 Summer Cartwright 12

  13. Computer Sciences 368 Introduction to Perl Defining a Subroutine sub calculate_total { $total = 0; foreach my $item (@array) { $total += $item; } } • Put anywhere, but not in a statement or {} • Namespace is distinct (but don’t abuse this!) 2012 Summer Cartwright 13

  14. Computer Sciences 368 Introduction to Perl Using a Subroutine & subroutine_name ; subroutine_name (); & subroutine_name (); • & : almost always OK, often optional • () : often optional, sometimes helpful • A subroutine call is an expression: &halt_cpu if temperature_too_high(); 2012 Summer Cartwright 14

  15. Computer Sciences 368 Introduction to Perl When Subroutines Are Run #!/usr/bin/perl use strict; use warnings; my $target = 'world'; sub say_hello { print "Hello, $target!\n"; } print "Hello, everyone!\n"; $target = 'Tim'; say_hello(); Subroutine code not run when defined, only when called 2012 Summer Cartwright 15

  16. Computer Sciences 368 Introduction to Perl Subroutine Input: Arguments We want to provide input to a subroutine square_root(81); show_greeting('Tim'); average(@list_of_numbers); print_num_with_precision($pi, 10); 2012 Summer Cartwright 16

  17. Computer Sciences 368 Introduction to Perl Using Arguments I — The Bad Way Remember automatic variables? Within a subroutine, arguments are in @_ sub examples_of_using_arguments { foreach my $argument (@_) { print "Argument: '$argument'\n"; } if ($_[0] > $_[1]) { ... } my $named_argument = $_[2]; } 2012 Summer Cartwright 17

  18. Computer Sciences 368 Introduction to Perl Using Arguments II — Better Options sub option_1 { my ($foo, $bar) = @_; # ... } sub option_2 { my $foo = shift; # @_ is implied my $bar = shift; # @_ is implied # ... } 2012 Summer Cartwright 18

  19. Computer Sciences 368 Introduction to Perl Subroutine Output: Return Values Default: Return the last expression evaluated sub bigger { my ($a, $b) = @_; if ($a > $b) { $a } else { $b } } An explicit return is usually clearer: • Stops executing the subroutine immediately • Returns the given value return; return 42; return "Hello, $name\n"; 2012 Summer Cartwright 19

  20. Computer Sciences 368 Introduction to Perl Returning Lists Perl lets you return lists, too: sub how_do_i_love_thee { # ... return @the_ways; } my @array = how_do_i_love_thee(); print "Let me count... " print scalar(@array); print "\n"; 2012 Summer Cartwright 20

  21. Computer Sciences 368 Introduction to Perl Scoping sub subroutine { my $answer = shift; $answer /= 6; print "Subroutine answer: $answer\n"; } my $answer = 42; print "Main answer: $answer\n"; subroutine($answer); print "Main answer: $answer\n"; 2012 Summer Cartwright 21

  22. Computer Sciences 368 Introduction to Perl Make a Subroutine… • For repeated code (DRY) • For logical organization – capture main flow vs. parts – break up excessively long parts – scope control • For testing Already been using: print , chomp , open , … 2012 Summer Cartwright 22

  23. Computer Sciences 368 Introduction to Perl ask_questions() 2012 Summer Cartwright 23

  24. Computer Sciences 368 Introduction to Perl Other Scripting Languages • All have procedures • Syntax varies widely • Look for: – explicit declaration of argument signature [Ruby] def foo(arg1, arg2, blah) – default arguments [Ruby] def bar(arg1, arg2 = 42) – di ff erent scoping rules (PHP) – di ff erent requirements (Python requires return) – anonymous functions / closures (Ruby) 2012 Summer Cartwright 24

  25. Computer Sciences 368 Introduction to Perl Homework • Unit conversions! • Subroutine usage is a bit forced… • Extra cool bonus challenge: Can you avoid defining the conversion factor between every pair of units? Imagine you have 10 di ff erent length units (inch, foot, mile, meter, etc.); there are 10 × 9 = 90 unique conversion pairs (e.g., inch –> foot). But I claim you need only 9–10… 2012 Summer Cartwright 25

Recommend


More recommend