Μέχρι τώρα καλούσαμε μια υπορουτίνα δίνοντας απλώς το όνομά της μετά το σύμβολο & που είπαμε ότι είναι προαιρετικό. Προαιρετικές επίσης είναι και οι παρενθέσεις που την ακολουθούν. Η υπορουτίνα justaroutine μπορεί να κληθεί ως justaroutine ή &justaroutine ή justaroutine() ή &justaroutine(). Προτιμούμε πάντως το τελευταίο.
Οι παρενθέσεις χρησιμοποιούνται στην περίπτωση που θέλουμε να δώσουμε κάποιες τιμές στην υπορουτίνα μας για να τις χρησιμοποιήσει. Όπως και στην περίπτωση της εξαγωγής τιμών (return) αυτό γίνεται με τη μορφή λίστας και οι τιμές αποθηκεύονται στην default array που είναι η @_. Έτσι έχουμε:
&justaroutine (85,99,138);
my $subtest = &justaroutine(85,99,138);
print "$subtest\n";
sub justaroutine
{
my $sum = $_[0] + $_[1] + $_[2] ;
return $sum;
}
Η justaroutine πήρε τις τιμές 85,99,138 και τις αποθήκευσε στην @_. Εμείς τις αφαιρέσαμε μια μια (μέσω της $_) και τις χρησιμοποιήσαμε. (Η εκτύπωση εδώ μας δίνει 322.)
Το ίδιο αποτέλεσμα έχουμε και στην περίπτωση που το script μας γίνει πιο ευέλικτο, δηλαδή:
my $a = 85;
my $b = 99;
my $c = 138;
&justaroutine ($a,$b,$c);
my $subtest = &justaroutine($a,$b,$c);
κ.λπ.
Ένας γρήγορος τρόπος για να δώσουμε τις εξωτερικές τιμές σε μεταβλητές της υπορουτίνας μας είναι και ο:
sub justaroutine
{
my ($value1, $value2, $value3) = @_;
my $sum = $value1 + $value2 + $value3 ;
return $sum;
}
Αν έχετε δει ποτέ κώδικα άλλων προγραμμάτων Perl (και αν έχετε φτάσει μέχρι εδώ σίγουρα θα έχετε κάνει και άλλες αναζητήσεις μόνοι σας) θα συναντήσατε ίσως συχνά κάποια μυστηριώδη κωδικοποίηση της μορφής $some_variable = shift. Αυτό σημαίνει ότι η μεταβλητή μας παίρνει την πρώτη στη σειρά τιμή της @_ (αν θέλαμε την τελευταία θα δηλώναμε $some_variable = pop). Έτσι, ο κώδικάς μας μπορεί να γίνει και:
sub justaroutine
{
my $value1 = shift;
# Παίρνει την πρώτη τιμή δηλαδή την $a
my $value2 = shift;
# Παίρνει την δεύτερη τιμή δηλαδή την $b
my $value3 = shift;
# Παίρνει την τρίτη τιμή δηλαδή την $c
my $sum = $value1 + $value2 + $value3 ;
return $sum;
}
Φυσικά αντί να δίνουμε απόλυτες τιμές (π.χ. $_[1]) πράγμα προβληματικό για μεγάλο αριθμό δεδομένων μπορούμε να δουλέψουμε με κάποιο loop αν αυτό είναι δυνατό. Έτσι, το παραπάνω παράδειγμα γίνεται:
my $a = 85;
my $b = 99;
my $c = 138;
&justaroutine ($a,$b,$c);
my $subtest = &justaroutine($a,$b,$c);
print "$subtest\n";
sub justaroutine
{
my $sum = 0 ;
foreach my $temp (@_)
{
$sum = $sum + $temp;
# ή $sum += $temp; αν προτιμάτε τη συντομογραφία
}
return $sum;
}