Syntax
To declare a named subroutine without defining it, use one of these forms:
subNAMEsubNAMEPROTOsubNAMEATTRSsubNAMEPROTOATTRS
To declare and define a named subroutine, add a
BLOCK:
subNAMEBLOCKsubNAMEPROTOBLOCKsubNAMEATTRSBLOCKsubNAMEPROTOATTRSBLOCK
To create an anonymous subroutine or closure, leave out the
NAME:
subBLOCKsubPROTOBLOCKsubATTRSBLOCKsubPROTOATTRSBLOCK
PROTO and
ATTRS stand for the prototype and
attributes, each of which is discussed in its own section later in
this chapter. They’re not so important—the
NAME and the
BLOCK are the essential parts, even when
they’re missing.
For the forms without a NAME, you
still have to provide some way of calling the subroutine. So be sure
to save the return value since this form of sub declaration is not only compiled at
compile time as you would expect, but also produces a runtime return
value:
$subref = sub BLOCK;To import subroutines defined in another module, say:
useMODULEqw(NAME1 NAME2 NAME3...);
To call subroutines directly, say:
NAME(LIST) # & is optional with parentheses.NAMELIST# Parens optional if sub predeclared/imported. &NAME# Exposes current @_ to that subroutine, # (and circumvents prototypes).
To call subroutines indirectly (by name or by reference), use any of these:
&$subref(LIST) # The & is not optional on indirect call $subref–>(LIST) # (unless using infix notation). &$subref # Exposes current @_ to that subroutine.
The official name of a subroutine includes the & prefix. A ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access