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
War es hilfreich?

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"}'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top