1 2 3 4 5
use Array::Utils qw(:all); my @new = (1,2,3,4); my @old = (4,5,6,7,8); push @new, splice(array_minus( @old, @new), 0, 3); # Einzeiler print join ",", @new;
1
2
3
$ perl /tmp/foo.pl
Experimental splice on scalar is now forbidden at /tmp/foo.pl line 4, near "3)"
Execution of /tmp/foo.pl aborted due to compilation errors.
2018-11-18T12:05:00 RaubtierFrage: was möchtest du eigentlich erreichen? Also was ist das Ziel der gesamten Aktion.
2018-11-18T12:05:00 RaubtierEIch würde also von einem Einzeiler abraten, der einen aufgrund der Funktionen in die falsche Denkrichtung lenkt.
1 2
push @new, map { $_ // () } # nur nicht-undef (array_minus( @old, @new))[0..2];
push @new, head(3, array_minus(@old, @new));
1 2 3 4
my @new = (1,2,3,4); my @old = (4,5,6,7,8); say keys { map { $_ => 1 } @new, @old };
1 2 3 4 5
my @new = (1,2,3,4); my @old = (4,5,6,7,8); my $num_elements = 3; push @new, grep { !($_ ~~ \@new) && $num_elements-- > 0 } @old;
1 2 3 4 5
use Array::Utils qw(:all); my @new = (1,2,3,4); my @old = (4,5,6,7,8); push @new, splice(@{[array_minus( @old, @new)]}, 0, 3); # Einzeiler print join ",", @new;
1 2 3 4
my @new = (1,2,3,4); my @old = (4,5,6,7,8); push @new, (array_minus( @old, @new))[0..2]; # Einzeiler print join ",", @new;
QuoteA list is a fixed collection of scalars.
1 2
# get items from array @a that are not in array @b my @minus = array_minus( @a, @b );
2018-11-19T08:15:30 reneeSo ganz einfach ist das nicht ;-) Es gibt nämlich mehrere Arten von Listen...
1 2 3 4 5
my @a = ('a','A'); my @b = ('b','B'); my @ref = \(@a,@b); # @ref = (['a','A'],['b','B']) sub l { my @l = (1,2); return @l; } my @lref = \l; # @lref = (\1, \2) - Return-Werte sind Listen!
1 2 3 4 5 6 7 8 9 10
my @x = (1,2,3); my @y = keys %ENV; foo(scalar @x, @x, @y); sub foo{ my $x = shift; my @x = map {shift} ($_[0]..$_[$x-1]); local $, = "\n"; print @_; }
my @x = (1,2,4711);
my @x = map {shift} ($_[0]..$_[$x-1]);
my @x = map {shift} (@_[0..$x-1]);
my @x = splice(@_,0,$x);
QuoteÄh, ja, es gibt viele Wege zum Ziel, und Längenfelder sind einer davon. Das map funktioniert hier aber eher zufällig, weil @x die "passenden" Werte hat.
1 2 3 4 5 6 7 8 9 10
my @x = qw(anton berta cäsar); my @y = keys %ENV; foo(scalar @x, @x, @y); sub foo{ my $x = shift; my @x = map { shift @_ } 0 .. $x - 1; local $, = "\n"; print @x; }
2018-11-19T15:08:55 reneeWie kommen denn mehrere Arrays in @ARGV an?
2018-11-18T13:47:41 haj...
Am FAQ-Eintrag, den Raubtier ja ebenfalls angegeben hat, finde ich den ersten Satz ein bisschen irreführend;
QuoteA list is a fixed collection of scalars.
Es ist ein bisschen mehr als das, denn sonst wüsste array_minus( @old, @new) nicht, wo @old aufhört und @new beginnt.
1
2
3
4
sub array_minus(\@\@) {
my %e = map{ $_ => undef } @{$_[1]};
return grep( ! exists( $e{$_} ), @{$_[0]} );
}
1 2 3 4 5
my %hunt = (); @hunt{@old,@new} = (); $, = "\n"; print sort keys %hunt; # 1 2 3 4 5 6 7 8
2018-11-19T08:50:48 rostigenau das ist ja aber nicht Ziel der Aufgabe...(@old, @new) liefert auf jeden Fall alle Elemente die in @old und @new enthalten sind.
Quote*nicht* "ich möchte alle aus der zweiten anhängen, die aber nicht schon in der ersten vorhanden sind" Deswegen das splice.Ich habe zwei Listen/Array und möchte an die erste noch N (oder weniger/$#) Werte aus der zweiten anhängen, die aber nicht schon in der ersten vorhanden sind
1 2 3 4 5
use List::MoreUtils qw(distinct); my @new = (1..4); my @old = (4..8); @new = distinct(@new, @old); print join(", ", @new);
1
2
$ /usr/bin/perl -MList::MoreUtils=distinct -le '@new = (1..4); my @old = (4..8);; print join(", ", distinct(@new, @old));'
1, 2, 3, 4, 5, 6, 7, 8
2018-12-07T16:16:49 sno-jrWas spricht denn gegen: