/ / Ako skontrolovať, či je prvok @_ iba na čítanie v Perl sub? - perl, parametre, iba na čítanie, podprogram

Ako skontrolovať, či prvok @_ je iba na čítanie v Perl sub? - Perl, parametre, readonly, podprogram

Keď môj sub potrebuje prejsť späť cez výstupjeden z parametrov (návratová hodnota sa už používa na odovzdanie iného výstupu), dôjde k chybe spustenia, keď tento parameter obsahuje konštantu volajúceho. Príklad:

# Increases the input by 1 and reports if the new value is bigger than 10.
sub IncreaseByOne {
$_[0] ++;
return ($_[0] > 10 ? 1 : 0);
}

my $x = 1;
IncreaseByOne($x);  # This is OK.
IncreaseByOne(1);   # This is not OK.

Moja otázka: Existuje spôsob, ako v rámci sub zistiť, či je $ _ [0] iba na čítanie? (Chápem, že mnohí by povedali, že nie je dobrým zvykom vracať informácie prostredníctvom jedného z parametrov. Ale v mojej situácii to naozaj potrebujem.)

odpovede:

4 pre odpoveď č. 1

Ak má sub zvyšovať hodnotu, malo by zlyhať, ak to nie je možné: neprekvapujte používateľov tichým ignorovaním problému. Táto chyba je dobrá vec!

Ak je to však skutočne nevyhnutné, môžete vyskúšať, či je skalárny iba na čítanie:

use Scalar::Util "readonly";

sub IncreaseByOne {
readonly($_[0]) or $_[0]++;
...
}

Upozorňujeme, že namiesto použitia vonkajších parametrov (čo vedie k neočakávaným problémom, aké ste zažili), je často lepšie vrátiť zoznam viacerých hodnôt:

sub IncreaseByOne {
my ($x) = @_;
$x++;
my $more_than_ten = ($x > 10);
return $x, $more_than_ten;
}