Jemand zu Hause?
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;
Array::Utils das macht. Ohne den Prototyp 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.
perlfunc wantarray gelesen habe: This function should have been named wantlist() instead. Wie wahr.1 2
# get items from array @a that are not in array @b my @minus = array_minus( @a, @b );
perlsub.2018-11-19T08:15:30 reneeSo ganz einfach ist das nicht ;-) Es gibt nämlich mehrere Arten von Listen...
perlfaq4, aber so ganz glücklich bin ich damit nicht. Ein paar Eigenschaften von Perl sind da etwas schräg, und wenn ich mich recht erinnere, sind sie deswegen so schräg, weil sie schon in Perl 4 so waren. Insbesondere bei den eingebauten Funktionen wie push.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; }
QuoteIch finde zusätzliche Längenangaben extrem hässlich
2018-11-19T14:14:27 RaubtierReferenzen nehmen?!
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, 82018-12-07T16:16:49 sno-jrWas spricht denn gegen:
use strict; use warnings;