Wie soll ich Perls Skalar -Reichweite -Operator verwenden?
Frage
Was ist der Skalar "..". Operator typischer Gebrauch? Wählt es nur Textblöcke aus?
Interessantes Beispiel für mich:
sub get_next {
print scalar($$..!$$), "\n";
}
get_next for 1 .. 5; # prints numbers from 1 to 5
get_next for 1 .. 5; # prints numbers from 6 to 10
Lösung
Die Leute scheinen hier kaum darüber zu wissen
while (<>) {
print if /BEGIN/ .. /END/;
}
oder
while (<>) {
print if 3 .. 5; # prints lines 3 through 5
}
Letzteres ist syntaktischer Zucker für die Überprüfung der Eingangsleitungsnummer ($.
)
... if $. == 3 .. $. == 5;
was auf die seltsam aussehende
#! /usr/bin/perl -l
for ($_ = 1; $_ <= 10; ++$_) {
print if $_ == 4 .. $_ == 7;
}
Die Ausgabe des obigen Programms ist
4 5 6 7
Wenn Sie eine Art Klammerkrankung haben, testen Sie dies in Subs:
for (...) {
do_foo($x,$y,$z) if begin($x) .. end($z);
}
Andere Tipps
Ich denke, das wird den Trick tun .. aber ich habe es nicht getestet. generasacodicetagpre.
Hier ist ein Ort, an dem Sie die unbeabsichtigte Verwendung des Scalar -Range -Operators sehr vorsichtig sein müssen: Unterroutine kehrt zurück.
sub range {
my $start = shift;
my $end = shift;
return $start .. $end;
}
@foo = range( 1, 5 ); # ( 1, 2, 3, 4, 5 )
$foo = range( 1, 5 ); # False or maybe true. Who knows.
Wenn Sie diese Unterroutine im skalaren Kontext nennen, werden Sie eine Überraschung erhalten.
Nachdem ich von einer Variante dieses Problems gebissen wurde, stelle ich jetzt immer sicher, dass ich eine Liste zurücksetzt, wodurch Array-ähnliches Kontextverhalten für meine U-Boote erhalte. Wenn ich ein anderes kontextspezifisches Verhalten (sehr selten) brauche, benutze ich wantarray
.
sub range {
my $start = shift;
my $end = shift;
my @result = $start .. $end;
return @result;
}
Eine weitere Verwendung sind einfache Zähler wie diese:perl -e 'foreach ( 1 .. 100 ){print"$_\n"}'