B(3perl)

πŸ’– NAME πŸ’–

so bestie, meet B β€” The Perl Compiler Backend 🧠✨ (it's B(3perl), from the Perl Programmers Reference Guide, iykyk). fr fr, this is the module that lets your perl program go digging around in its own guts πŸ’…


✨ SYNOPSIS ✨

use B;

that's it. that's the whole vibe check. πŸŽ€


πŸ¦‹ DESCRIPTION πŸ¦‹

okay so the B module ships a whole lil family of classes that let a Perl program delve into its own innards 🫣🫢. it's literally the module used to implement the "backends" of the Perl compiler.

and no, you do NOT need to know this module to use the compiler β€” for the user-visible part you want the O module instead, bestie πŸ‘‘

B is for the girlies who wanna write new compiler backends. and heads up πŸ™ˆ this documentation assumes you already know a fair amount about perl's internals, including stuff like SVs, OPs, and the internal symbol table and syntax tree of a program. so like... not a beginner read, no cap. πŸ“š


πŸ‘‘ OVERVIEW πŸ‘‘

the B module has a set of utility functions for querying the current state of the Perl interpreter πŸ•΅οΈβ™€οΈβœ¨. typically these functions return objects from the B::SV and B::OP classes, or their derived classes. and those classes in turn define methods for querying the resulting objects about their own internal state. it's giving object-oriented introspection, and honestly? obsessed. πŸ’…

🌸 Utility Functions 🌸

the B module exports a whole variety of functions: some are simple utility functions, and the others hand your Perl program a way to grab an initial "handle" on an internal object. πŸŽ€

🧚 Functions Returning B::SV, B::AV, B::HV, and B::CV objects

for the deets on the class hierarchy of these objects and the methods you can call on them, scroll down to "OVERVIEW OF CLASSES" and "SV-RELATED CLASSES" below πŸ‘‡

  • sv_undef β€” returns the SV object corresponding to the C variable sv_undef. πŸ’œ
  • sv_yes β€” returns the SV object corresponding to the C variable sv_yes. βœ…
  • sv_no β€” returns the SV object corresponding to the C variable sv_no. ❌
  • svref_2object(SVREF) β€” takes a reference to any Perl value, and turns the referred-to value into an object in the appropriate B::OP-derived or B::SV-derived class. apart from functions like main_root, this is the primary way to get an initial "handle" on an internal perl data structure, which you can then follow with the other access methods. 🫢
⚠️ real talk: the returned object is only valid as long as the underlying OPs and SVs continue to exist. do NOT try to use the object after the underlying structures are freed, bestie. that's a crunchy glitch situation. πŸ’€
  • amagic_generation β€” returns the SV object corresponding to the C variable amagic_generation. as of Perl 5.18, this is just an alias to PL_na, so its value is meaningless. πŸ™ˆ like, don't bother, it's giving nothing.
  • init_av β€” returns the AV object (i.e. in class B::AV) representing INIT blocks. 🌱
  • check_av β€” returns the AV object (i.e. in class B::AV) representing CHECK blocks. πŸ”
  • unitcheck_av β€” returns the AV object (i.e. in class B::AV) representing UNITCHECK blocks. πŸ§ͺ
  • begin_av β€” returns the AV object (i.e. in class B::AV) representing BEGIN blocks. πŸš€
  • end_av β€” returns the AV object (i.e. in class B::AV) representing END blocks. 🏁
  • comppadlist β€” returns the PADLIST object (i.e. in class B::PADLIST) of the global comppadlist. in Perl 5.16 and earlier it returns an AV object (class B::AV). πŸ—‚οΈ
  • regex_padav β€” only when perl was compiled with ithreads. 🧡
  • main_cv β€” returns the (faked) CV corresponding to the main part of the Perl program. πŸ‘‘ main character energy fr.

πŸ”Ž Functions for Examining the Symbol Table

  • walksymtable(SYMREF, METHOD, RECURSE, PREFIX) β€” walk the symbol table starting at SYMREF and call METHOD on each symbol (a B::GV object) visited. when the walk reaches package symbols (such as Foo::) it invokes RECURSE, passing in the symbol name, and only recurses into the package if that sub returns true. βœ…

PREFIX is the name of the SYMREF you're walking. πŸšΆβ™€οΈ

for example:

# Walk CGI's symbol table calling print_subs on each symbol.
# Recurse only into CGI::Util::
walksymtable(\%CGI::, 'print_subs',
             sub { $_[0] eq 'CGI::Util::' }, 'CGI::');

print_subs() is a B::GV method you have declared, bestie. also peep "B::GV Methods" below πŸ‘‡

πŸ”₯ Functions Returning B::OP objects or for walking op trees

for the deets on the class hierarchy of these objects and the methods you can call on them, look below at "OVERVIEW OF CLASSES" and "OP-RELATED CLASSES" 🌈

  • main_root β€” returns the root op (i.e. an object in the appropriate B::OP-derived class) of the main part of the Perl program. 🌳
  • main_start β€” returns the starting op of the main part of the Perl program. 🏁
  • walkoptree(OP, METHOD) β€” does a tree-walk of the syntax tree based at OP and calls METHOD on each op it visits. each node is visited before its children. if walkoptree_debug (see below πŸ‘‡) has been called to turn debugging on, then the method walkoptree_debug is called on each op before METHOD is called. πŸ›βœ¨
  • walkoptree_debug(DEBUG) β€” returns the current debugging flag for walkoptree. if the optional DEBUG argument is non-zero, it sets the debugging flag to that. see the description of walkoptree above for what the debugging flag actually does. πŸ•ΉοΈ

🌈 Miscellaneous Utility Functions

  • ppname(OPNUM) β€” return the PP function name (e.g. pp_add) of op number OPNUM. 🏷️
  • hash(STR) β€” returns a string in the form "0x..." representing the value of the internal hash function used by perl on string STR. #️⃣
  • cast_I32(I) β€” casts I to the internal I32 type used by that perl. πŸͺ„
  • minus_c β€” does the equivalent of the -c command-line option. obviously, this is only useful in a BEGIN block, or else the flag is set too late. ⏰😭
  • cstring(STR) β€” returns a double-quote-surrounded escaped version of STR which can be used as a string in C source code. πŸ’»
  • perlstring(STR) β€” returns a double-quote-surrounded escaped version of STR which can be used as a string in Perl source code. πŸͺ
  • safename(STR) β€” returns the string with the first character modified if it is a control character. it converts it to ^X format first, so that "\cG" becomes "^G". this is used internally by B::GV::SAFENAME, but you can call it directly. πŸŽ€
  • class(OBJ) β€” returns the class of an object without the part of the classname preceding the first ::. this is used to turn B::UNOP into UNOP, for example. 🏷️
  • threadsv_names β€” this used to provide support for the old 5.005 threading module. it now does nothing. πŸ’€ ghost of modules past.

🎁 Exported utility variables

  • @optype
my $op_type = $optype[$op_type_num];

a simple mapping of the op type number to its type (like 'COP' or 'BINOP'). πŸ—ΊοΈ

  • @specialsv_name
my $sv_name = $specialsv_name[$sv_index];

certain SV types are considered 'special'. they're represented by B::SPECIAL and are referred to by a number from the specialsv_list. this array maps that number back to the name of the SV (like 'Nullsv' or '&PL_sv_undef'). ⭐


🌈 OVERVIEW OF CLASSES 🌈

okay so the C structures used by Perl's internals to hold SV and OP information (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) are modelled on a class hierarchy πŸ“, and the B module gives you access to them via a true object hierarchy. structure fields which point to other objects (whether types of SV or types of OP) are represented by the B module as Perl objects of the appropriate class. πŸ’…

the bulk of the B module is literally the methods for accessing fields of these structures. 🧠

⚠️ heads up bestie: all access is read-only. you cannot modify the internals by using this module, periodt. 🚫 also β€” the B::OP and B::SV objects created by this module are only valid for as long as the underlying objects exist; their creation doesn't increase the reference counts of the underlying objects. trying to access the fields of a freed object will give you incomprehensible results, or worse. πŸ’€πŸ˜­ don't do it.

B::IV, B::NV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::PVLV, B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. ✨ these classes correspond in the obvious way to the underlying C structures of similar names. and the inheritance hierarchy mimics the underlying C "inheritance":

                              B::SV
                                |
                   +------------+------------+
                   |            |            |
                 B::PV        B::IV        B::NV
                  /  \         /           /
                 /    \       /           /
           B::INVLIST  B::PVIV           /
                            \           /
                             \         /
                              \       /
                               B::PVNV
                                  |
                                  |
                               B::PVMG
                                  |
              +-------+-------+---+---+-------+-------+
              |       |       |       |       |       |
            B::AV   B::GV   B::HV   B::CV   B::IO B::REGEXP
                      |               |
                      |               |
                   B::PVLV          B::FM

access methods correspond to the underlying C macros for field access, usually with the leading "class indication" prefix removed (Sv, Av, Hv, ...). πŸͺ„ the leading prefix is only left in cases where its removal would cause a clash in method name. for example, GvREFCNT stays as-is since its abbreviation would clash with the "superclass" method REFCNT (corresponding to the C function SvREFCNT). πŸ‘‘

πŸ’œ B::SV Methods πŸ’œ

  • REFCNT
  • FLAGS
  • IsBOOL β€” returns true if the SV is a boolean (true or false). you can then use TRUE to check if the value is true or false. 🎯
my $something = ( 1 == 1 ) # boolean true
             || ( 1 == 0 ) # boolean false
             || 42         # IV true
             || 0;         # IV false
my $sv = B::svref_2object(\$something);

say q[Not a boolean value]
    if ! $sv->IsBOOL;

say q[This is a boolean with value: true]
    if   $sv->IsBOOL && $sv->TRUE_nomg;

say q[This is a boolean with value: false]
    if   $sv->IsBOOL && ! $sv->TRUE_nomg;
  • object_2svref β€” returns a reference to the regular scalar corresponding to this B::SV object. in other words, this method is the inverse operation to the svref_2object() subroutine. πŸ” this scalar and other data it points at should be considered read-only: modifying them is neither safe nor guaranteed to have a sensible effect. πŸ™ˆ
  • TRUE β€” returns a boolean indicating whether Perl would evaluate the SV as true or false. 🧐
⚠️ warning: this call performs 'get' magic. if you only want to check the nature of this SV, use the TRUE_nomg helper instead. πŸͺ„

this is an alias for SvTRUE($sv). πŸ’–

  • TRUE_nomg β€” checks if the value is true, and it does not do 'get' magic, okay? Returns a boolean telling you whether Perl would look at that SV and go "yeah, true" or "nah, false". It's literally just an alias for SvTRUE_nomg($sv). πŸ’…

πŸ’œ B::IV Methods πŸ’œ

  • IV β€” hands you the value of the IV, read as a signed integer. ⚠️ Heads up bestie, this one will straight-up mislead you if FLAGS & SVf_IVisUV. Maybe you actually want the int_value method instead? Just saying. πŸ‘€
  • IVX
  • UVX
  • int_value β€” returns the value of the IV as an integer, and the glow-up here is that it differs from IV by returning the correct value no matter whether it's stored signed or unsigned. She's reliable, we stan. ✨
  • needs64bits
  • packiv

🌸 B::NV Methods 🌸

  • NV
  • NVX
  • COP_SEQ_RANGE_LOW
  • COP_SEQ_RANGE_HIGH β€” okay so these last two? They're only valid for pad name SVs, no cap. And plot twist: they only lived in the B::NV class before Perl 5.22. In 5.22 they got moved to the B::PADNAME class. She relocated, respect the journey. πŸ¦‹

πŸŽ€ B::RV Methods πŸŽ€

  • RV

⭐ B::PV Methods ⭐

  • PV β€” this is THE one you usually want, periodt. It builds a string using the length and offset info sitting in the struct: for ordinary scalars it returns the string you'd actually see from Perl, even if it's hiding null characters in there. Iconic.
  • RV β€” same as B::RV::RV, except it will die() if the PV isn't a reference. So like, don't play with her.
  • PVX β€” this method is less often useful, ngl. It assumes the string stored in the struct is null-terminated and just disregards the length info entirely. πŸ™ˆ

But! It's the appropriate method to use if you need to grab the name of a lexical variable out of a padname array. Lexical variable names are always stored with a null terminator, and the length field (CUR) is overloaded for other purposes, so you literally can't rely on it here. iykyk.

  • CUR β€” returns the internal length field, which is the number of internal bytes, not necessarily the number of logical characters. (bytes β‰  characters, we been knew πŸ’€)
  • LEN β€” returns the number of bytes allocated (via malloc) for storing the string. This is 0 if the scalar does not "own" the string.

🫢 B::PVMG Methods 🫢

  • MAGIC
  • SvSTASH

πŸ”₯ B::MAGIC Methods πŸ”₯

  • MOREMAGIC
  • precomp β€” only valid on r-magic, and it returns the string that generated the regexp. 🧚
  • PRIVATE
  • TYPE
  • FLAGS
  • OBJ β€” will die() if you call it on r-magic. She said no. πŸ’€
  • PTR
  • REGEX β€” only valid on r-magic; returns the integer value of the REGEX stored in the MAGIC.

🌈 B::INVLIST Methods 🌈

  • prev_index β€” returns the cache result of the previous invlist_search() (internal usage, so don't get too attached bestie).
  • is_offset β€” returns a boolean value (0 or 1) so you know if the invlist is using an offset. When false, the list begins with the code point U+0000. When true, the list begins with the following elements.
  • array_len β€” returns an integer with the size of the array used to define the invlist.
  • get_invlist_array β€” returns a list of integers representing the array the invlist uses. ⚠️ Note: this cannot be used while you're in the middle of iterating on an invlist, and it croaks. So like, wait your turn.

πŸ’– B::PVLV Methods πŸ’–

  • TARGOFF
  • TARGLEN
  • TYPE
  • TARG

✨ B::BM Methods ✨

  • USEFUL
  • PREVIOUS
  • RARE
  • TABLE

πŸ’œ B::REGEXP Methods πŸ’œ

  • REGEX
  • precomp
  • qr_anoncv
  • compflags β€” the last two were added in Perl 5.22. πŸŽ€

πŸ¦‹ B::GV Methods πŸ¦‹

  • is_empty β€” returns TRUE if the GP field of the GV is NULL.
  • NAME
  • SAFENAME β€” returns the name of the glob, but if the first character of the name is a control character, it converts it to ^X first. So *^G would give you back "^G" rather than "\cG". Cute, right?

It's useful if you wanna print out the name of a variable. And if you keep yourself restricted to globs that exist at compile-time, the result ought to be unambiguous β€” because code like "${"^G"} = 1" compiles as two ops: a constant string and a dereference (rv2gv). Which means the glob gets created at runtime. Sneaky.

If you're working with globs at runtime and you need to disambiguate *^G from *{"^G"}, then you should use the raw NAME method. No shortcuts bestie. πŸ’…

  • STASH
  • SV
  • IO
  • FORM
  • AV
  • HV
  • EGV
  • CV
  • CVGEN
  • LINE
  • FILE
  • FILEGV
  • GvREFCNT
  • FLAGS
  • GPFLAGS β€” this last one is only present in perl 5.22.0 and higher.

🌸 B::IO Methods 🌸

B::IO objects derive from IO objects, so honestly you'll get more info from the IO object itself. Periodt.

For example:

$gvio = B::svref_2object(\*main::stdin)->IO;
$IO = $gvio->object_2svref();
$fd = $IO->fileno();
  • LINES
  • PAGE
  • PAGE_LEN
  • LINES_LEFT
  • TOP_NAME
  • TOP_GV
  • FMT_NAME
  • FMT_GV
  • BOTTOM_NAME
  • BOTTOM_GV
  • SUBPROCESS
  • IoTYPE β€” a character symbolizing the type of IO Handle:
  -     STDIN/OUT
  I     STDIN/OUT/ERR
  <     read-only
  >     write-only
  a     append
  +     read and write
  s     socket
  |     pipe
  I     IMPLICIT
  #     NUMERIC
  space closed handle
  \0    closed internal handle
  • IoFLAGS
  • IsSTD β€” takes one argument ('stdin' | 'stdout' | 'stderr') and returns true if the IoIFP of the object equals the handle whose name you passed in. Like, $io->IsSTD('stderr') is true if IoIFP($io) == PerlIO_stderr(). Simple as. βœ…

πŸŽ€ B::AV Methods πŸŽ€

  • FILL
  • MAX
  • ARRAY
  • ARRAYelt β€” like ARRAY, but it takes an index as an argument so you get just one element instead of a whole list. She's efficient. ✨

⭐ B::CV Methods ⭐

  • STASH
  • START
  • ROOT
  • GV
  • FILE
  • DEPTH
  • PADLIST β€” returns a B::PADLIST object.
  • OUTSIDE
  • OUTSIDE_SEQ
  • XSUB
  • XSUBANY β€” for constant subroutines, returns the constant SV the subroutine gives back.
  • CvFLAGS
  • const_sv
  • NAME_HEK β€” returns the name of a lexical sub, otherwise undef.

πŸ”₯ B::HV Methods πŸ”₯

  • FILL
  • MAX
  • KEYS
  • RITER
  • NAME
  • ARRAY

B::OP, B::UNOP, B::UNOP_AUX, B::BINOP, B::LOGOP, B::LISTOP, B::PMOP, B::SVOP, B::PADOP, B::PVOP, B::LOOP, B::COP, B::METHOP.

These classes correspond in the obvious way to the underlying C structures with similar names. And the inheritance hierarchy mimics the underlying C "inheritance", like, exactly:

                                 B::OP
                                   |
                   +----------+---------+--------+-------+---------+
                   |          |         |        |       |         |
                B::UNOP    B::SVOP  B::PADOP  B::COP  B::PVOP  B::METHOP
                   |
               +---+---+---------+
               |       |         |
           B::BINOP  B::LOGOP  B::UNOP_AUX
               |
               |
           B::LISTOP
               |
           +---+---+
           |       |
        B::LOOP   B::PMOP

Access methods correspond to the underlying C structure field names, with the leading "class indication" prefix (op_) removed. Clean. 🧼

πŸ’œ B::OP Methods πŸ’œ

These methods get the values of similarly named fields inside the OP data structure. See the top of op.h for more info, bestie. πŸ“–

  • next
  • sibling
  • parent β€” returns the OP's parent. If it has no parent, or if your perl wasn't built with -DPERL_OP_PARENT, it returns NULL.

⚠️ And like, note this: the global variable $B::OP::does_parent is undefined on older perls that don't support the parent method. It's defined but false on perls that support the method but were built without -DPERL_OP_PARENT. And it's true otherwise. Three moods, okay? πŸ™ˆ

  • name β€” returns the op name as a string (e.g. add, rv2av).
  • ppaddr β€” returns the function name as a string (e.g. PL_ppaddr[OP_ADD], PL_ppaddr[OP_RV2AV]).
  • desc β€” returns the op description from the global C PL_op_desc array (e.g. addition, array deref).
  • targ
  • type
  • opt
  • flags
  • private
  • spare

🌈 B::UNOP Method 🌈

  • first

πŸ¦‹ B::UNOP_AUX Methods (since 5.22) πŸ¦‹

  • aux_list(cv) β€” returns a list of the elements of the op's aux data structure, or a null list if there's no aux. What you get back depends on the object's type, but it'll typically be a collection of B::IV, B::GV, etc. objects. cv is the B::CV object representing the sub the op is contained within.
  • string(cv) β€” returns a textual representation of the object (likely to be useful for deparsing and debugging), or an empty string if the op type doesn't support this. cv is the B::CV object representing the sub the op is contained within.

🌸 B::BINOP Method 🌸

  • last

πŸŽ€ B::LOGOP Method πŸŽ€

  • other

⭐ B::LISTOP Method ⭐

  • children

πŸ’– B::PMOP Methods πŸ’–

  • pmreplroot
  • pmreplstart
  • pmflags
  • precomp
  • pmoffset β€” only when perl was compiled with ithreads.
  • code_list β€” since perl 5.17.1.
  • pmregexp β€” added in perl 5.22, this method returns the B::REGEXP associated with the op. And the fun part: while PMOPs don't actually have pmregexp fields under threaded builds, this method returns the regexp under threads anyway. For convenience. She's doing the most so you don't have to. πŸ‘‘

🫢 B::SVOP Methods 🫢

  • sv
  • gv

πŸ”₯ B::PADOP Method πŸ”₯

  • padix

πŸ’œ B::PVOP Method πŸ’œ

  • pv

πŸ¦‹ B::LOOP Methods πŸ¦‹

  • redoop
  • nextop
  • lastop

🌈 B::COP Methods 🌈

The B::COP class is used for nextstate and dbstate ops. And as of Perl 5.22, it's also used for null ops that started out as COPs. Glow-up era. ✨

  • label
  • stash
  • stashpv
  • stashoff (threaded only)
  • file
  • cop_seq
  • line
  • warnings
  • io
  • hints
  • hints_hash

⭐ B::METHOP Methods (Since Perl 5.22) ⭐

  • first
  • meth_sv

Perl 5.18 introduced a new class, B::PADLIST, returned by B::CV's PADLIST method.

Perl 5.22 introduced the B::PADNAMELIST and B::PADNAME classes.

πŸ’– B::PADLIST Methods πŸ’–

  • MAX
  • ARRAY β€” a list of pads. The first one is a B::PADNAMELIST containing the names. The rest are currently B::AV objects, but that could change in future versions. So like, don't get too comfy. πŸ‘€
  • ARRAYelt β€” like ARRAY, but it takes an index as an argument to get just one element instead of a list of all of them.
  • NAMES β€” this method, introduced in 5.22, returns the B::PADNAMELIST. It's equivalent to ARRAYelt with a 0 argument.
  • REFCNT
  • id β€” this method, introduced in 5.22, returns an ID shared by clones of the same padlist.
  • outid β€” this method, also added in 5.22, returns the ID of the outer padlist.

πŸŽ€ B::PADNAMELIST Methods πŸŽ€

  • MAX
  • ARRAY
  • ARRAYelt β€” these two methods return the pad names, using B::SPECIAL objects for null pointers and B::PADNAME objects otherwise.
  • REFCNT

πŸ’– B::PADNAME Methods πŸ’–

okay bestie, these are the little accessor methods you get on a B::PADNAME object πŸ‘‘ every lexical name in a pad has one of these, and here's literally everything you can ask it:

  • PV β€” the string value, the plain little pointer-to-string vibe ✨
  • PVX β€” the string value but make it longer (the PVX flavour, iykyk)
  • LEN β€” how long that string is πŸ”’
  • REFCNT β€” how many things are pointing at it rn
  • GEN β€” the generation number, as one does
  • FLAGS β€” the flag situation 🚩 For backward-compatibility, if the PADNAMEt_OUTER flag is set, the FLAGS method adds the SVf_FAKE flag, too. (yes, extra flag for the old-school girlies, that's the deal)
  • TYPE β€” a B::HV object representing the stash for a typed lexical. no cap πŸ’…
  • SvSTASH β€” a backward-compatibility alias for TYPE. same energy, older name 🫢
  • OURSTASH β€” a B::HV object representing the stash for 'our' variables 🌈
  • PROTOCV β€” the prototype CV for a 'my' sub πŸŽ€
  • COP_SEQ_RANGE_LOW β€” sequence numbers representing the scope within which a lexical is visible. Meaningless if PADNAMEt_OUTER is set. ⚠️
  • COP_SEQ_RANGE_HIGH β€” Sequence numbers representing the scope within which a lexical is visible. Meaningless if PADNAMEt_OUTER is set. ⚠️
  • PARENT_PAD_INDEX β€” Only meaningful if PADNAMEt_OUTER is set. like, don't even look at it otherwise bestie πŸ™ˆ
  • PARENT_FAKELEX_FLAGS β€” Only meaningful if PADNAMEt_OUTER is set. same rule, girl πŸ’€
  • IsUndef β€” Returns a boolean value to check if the padname is PL_padname_undef. cute little true/false check ✨

πŸ¦‹ $B::overlay πŸ¦‹

okay so the optree is read-only, right? like, hands off, no touching πŸ”’ BUT there's this little overlay facility that lets you override what values the various B::*OP methods return for a particular op. it's giving "we're not editing the optree, we're just lying to it" πŸ’…

Here's the tea: $B::overlay should be set to reference a two-deep hash β€” indexed by OP address first, then by method name. Whenever an op method gets called, the value sitting in that hash is returned if it exists. easy! ✨

And guess who uses this? B::Deparse, to "undo" some optimisations πŸ‘‘ iconic behaviour fr fr.

For example:

local $B::overlay = {};
...
if ($op->name eq "foo") {
    $B::overlay->{$$op} = {
            name => 'bar',
            next => $op->next->next,
    };
}
...
$op->name # returns "bar"
$op->next # returns the next op but one

like, look at her go 😭 you literally told it bar and it said bar, periodt.


πŸ‘‘ AUTHOR πŸ‘‘

Malcolm Beattie, "mbeattie@sable.ox.ac.uk" β€” yes bestie, a whole legend wrote this for us, show some respect 🫢


and that's the whole page!! this is perl v5.44.0, dated 2026-10-17, from the B(3perl) manual 🌸 you literally read the entire thing, slay πŸ’–βœ¨πŸŽ€ go touch some grass (or, y'know, go deparse something) πŸ¦‹

πŸ“¦ where this page comes from
  • arch rolling: perl 5.44.0-1 Β· Artistic-1.0-Perl AND GPL-1.0-or-later
  • πŸ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms