B::Op_private(3perl)

✨ NAME ✨

B::Op_private β€” OP op_private flag definitions, bestie πŸ’…

It's a Perl Programmers Reference Guide situation and honestly? iconic.


🌸 SYNOPSIS 🌸

okay so here's the whole vibe:

use B::Op_private;

# flag details for bit 7 of OP_AELEM's op_private:
my $name  = $B::Op_private::bits{aelem}{7}; # OPpLVAL_INTRO
my $value = $B::Op_private::defines{$name}; # 128
my $label = $B::Op_private::labels{$name};  # LVINTRO

# the bit field at bits 5..6 of OP_AELEM's op_private:
my $bf  = $B::Op_private::bits{aelem}{6};
my $mask = $bf->{bitmask}; # etc

like… look at her. she's doing so much. 🫢


πŸ’– DESCRIPTION πŸ’–

So this module hands you four global hashes:

%B::Op_private::bits
%B::Op_private::defines
%B::Op_private::labels
%B::Op_private::ops_using

and they're all carrying info about the per-op meanings of the bits sitting inside the op_private field. four hashes, four besties, no cap ✨


πŸŽ€ %bits πŸŽ€

This one is indexed by op name and then by bit number (0..7). For single bit flags, it gives you the name of the define (if any) for that bit:

$B::Op_private::bits{aelem}{7} eq 'OPpLVAL_INTRO';

For bit fields, it returns a hash ref with all the tea about the field β˜• The same reference comes back for every bit position that makes up the bit field, so for example these both return the same hash ref:

$bitfield = $B::Op_private::bits{aelem}{5};
$bitfield = $B::Op_private::bits{aelem}{6};

not me finding that cute. πŸ¦‹

The general format of this hash ref is:

{
    # The bit range and mask; these are always present.
    bitmin        => 5,
    bitmax        => 6,
    bitmask       => 0x60,

    # (The remaining keys are optional)

    # The names of any defines that were requested:
    mask_def      => 'OPpFOO_MASK',
    baseshift_def => 'OPpFOO_SHIFT',
    bitcount_def  => 'OPpFOO_BITS',

    # If present, Concise etc will display the value with a 'FOO='
    # prefix. If it equals '-', then Concise will treat the bit
    # field as raw bits and not try to interpret it.
    label         => 'FOO',

    # If present, specifies the names of some defines and the
    # display labels that are used to assign meaning to particu-
    # lar integer values within the bit field; e.g. 3 is dis-
    # played as 'C'.
    enum          => [ qw(
                         1   OPpFOO_A  A
                         2   OPpFOO_B  B
                         3   OPpFOO_C  C
                     )],

};

bitmin, bitmax and bitmask are always there β€” the rest are optional, lowkey choose-your-own-adventure πŸ’«


⭐ %defines ⭐

This one gives you the value of every "OPp" define, like:

$B::Op_private::defines{OPpLVAL_INTRO} == 128;

the numbers said "let me introduce myself" πŸ”₯


🌈 %labels 🌈

This gives you the short display label</> for each define, exactly as used by "B::Concise" and perl -Dx, e.g.

$B::Op_private::labels{OPpLVAL_INTRO} eq 'LVINTRO';

and if the label equals '-', then Concise will treat that bit as a raw bit and won't even try to display it symbolically. she said "I'm not doing that" πŸ’€


🧚 %ops_using 🧚

For each define, this gives you a reference to an array of op names that use the flag:

@ops_using_lvintro = @{ $B::Op_private::ops_using{OPp_LVAL_INTRO} };

it's giving "who's using this flag" and honestly, everybody wants to know πŸ‘‘


🫢 friendly reminder bestie: %bits is indexed by op name and bit number (0..7), the bit-field hash ref is shared across every bit position in the field, and a label of '-' means raw bit, no symbolic display. that's the whole plot. no spoilers needed. ✨

and that's a wrap, literally β€” this page is from perl v5.44.0, dated 2026-10-17, and it lives under the manual name B::Op_private(3perl). slay, go read some op flags πŸ’–πŸŽ€πŸ¦‹

πŸ“¦ 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