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ď č. 1Ak 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;
}