In Perl, when one uses the sort
function with a custom comparison, the variables $a
and $b
are already assigned to the current pair of elements to compare, e.g. in:
@decreasing = sort { $b <=> $a } @list;
Wie kann ich andere Unterprogramme mit einer ähnlichen Funktionalität schreiben? Zum Beispiel, stellen wir uns vor, ich möchte eine Art von prozess_und_speicher
-Funktion schreiben, die etwas Besonderes mit jedem Element einer Liste macht und es dann in einer Datenbank speichert; und wobei die Variable $item
bereits dem aktuellen zu verarbeitenden Element zugewiesen ist. Ich würde gerne etwas wie das Folgende schreiben:
prozess_und_speicher { etwas_mit($item); } @list;
anstatt:
prozess_und_speicher { my $item = shift; etwas_mit($item); } @list;
Wie sollte ich dabei vorgehen?
UPDATE: Zur Vollständigkeit, obwohl die Antwort von flesk ohne Probleme funktioniert, um die von mir vorgenommenen Änderungen an der $item
-Variablen "ordnungsgemäß" zu lokalisieren, musste ich dem Rat von Axeman folgen. In der Datei SomePackage.pm
habe ich etwas Ähnliches platziert:
package SomePackage;
use strict;
require Exporter;
our @ISA = qw/Exporter/;
our @EXPORT = qw(prozess_und_speicher);
our $item;
sub import {
my $import_caller = caller();
{ no strict 'refs';
*{ $import_caller . '::item' } = \*item;
}
# Jetzt, ruf den Exporter auf!
goto &{ Exporter->can( 'import' ) };
}
sub prozess_und_speicher (&@) {
my $code = shift;
for my $x (@_) {
local *item = \$x;
$code->();
print "gespeichert: $item\n"
}
}
1;
Dann rufe ich das von main.pl
aus mit etwas Ähnlichem auf:
#!/usr/bin/perl -w
use strict;
use SomePackage;
prozess_und_speicher { print "gesehen: $item\n"; } (1, 2, 3);
Und erhalte das erwartete Ergebnis:
gesehen: 1
gespeichert: 1
gesehen: 2
gespeichert: 2
gesehen: 3
gespeichert: 3