2016-08-15 9 views
8

Potrzebuję mieć możliwość powiązania tablicy tablicowej z oryginalną tablicą w taki sposób, że wszelkie zmiany wprowadzone do oryginalnej tablicy (w tym usuwanie elementów) zostaną również wykonane w wycinku tablicy. Czy jest jakiś sposób na zrobienie tego?Jak powiązać wycinek tablicy z oryginalną tablicą, aby wszystkie zmiany wprowadzone w jednym zostały wprowadzone do obu?


Poniższy przykład nie działa jak chcę go, ale to jest po prostu nie do wykazania punkt próbuję uczynić.

Przykład:

my @array = 1 .. 10; 
my @slice = @array[3 .. 8]; 

splice @array, 5, 2; 

print "ARRAY: "; 
print join ', ', @array; 
print "\n"; 

print "SLICE: "; 
print join ', ', @slice; 

wyjściowa:

ARRAY: 1, 2, 3, 4, 5, 8, 9, 10 
SLICE: 4, 5, 6, 7, 8, 9 

Co szukam to sposób związać kawałek oryginalnej tablicy więc wyjście będzie wyglądać zamiast tego:

ARRAY: 1, 2, 3, 4, 5, 8, 9, 10 
SLICE: 4, 5, 8, 9 

Usunięcie 6 i 7 z oryginalnej tablicy spowoduje również usunięcie jej z wycinka tablicy.

Jak mogę osiągnąć coś takiego?

+0

Czy możesz wyjaśnić, dlaczego chcesz to zrobić? – ThisSuitIsBlackNot

+0

Pracuję nad skryptem, który obsługuje hierarchiczną strukturę bazy danych i chcę, aby każdy rekord zawierał tablicę rekordów podrzędnych. Jeśli jeden z rekordów przywoływanych na liście rekordów podrzędnych zostanie usunięty z całej bazy danych, chcę, aby tablica rekordów podrzędnych była automatycznie aktualizowana w celu usunięcia rekordu. – tjwrona1992

+0

Zasadniczo baza danych zawiera dużą tablicę wszystkich rekordów, a tablica rekordów podrzędnych byłaby fragmentem wielkiej tablicy. Jeśli rekord zostanie usunięty z dużej tablicy, chcę go usunąć z wszelkich plasterków, do których się odwołuje. – tjwrona1992

Odpowiedz

-3
use strict; 
use warnings; 
use Data::Dumper; 
my @array = 1..10; 
my @slice = \@array[3..8]; 

splice @array, 5, 2; 

print "ARRAY: "; 
print join ', ', @array; 
print "\n"; 

print "SLICE: "; 
print join ', ', @slice; 

wyjściowa:

ARRAY: 1, 2, 3, 4, 5, 8, 9, 10 
SLICE: SCALAR(0x29dcef0), SCALAR(0x29dcf20), SCALAR(0x29dcf08), SCALAR(0x29dcfb0), SCALAR(0x29dcfc, SCALAR(0x29dd058) 

Zamiast usuwania elementów można przypisać wartość zero w punkcie (to przypisać wartość zero w @slice też, bo @slice posiada refference do @array) i następnie usuń te 0 od ciebie @slice i, jeśli masz zaktualizowane @slice ze swoimi usuniętymi elementami

+0

To nie działa. Dodawanie 'splice @array, 5, 2; print join ',', @slice; 'nie produkuje oczekiwanych danych wyjściowych (i ani' splice @array, 5, 2, print join ',', map $$ _, @slice; ') – ikegami

+0

Użyłeś mojego kod? Wyjaśnij "nie odtwarza wyników OCZEKIWANYCH" –

+0

Jeśli przeczytasz całą odpowiedź, zobaczysz, że faktycznie dostarczyłem "obejście" dla usuniętych elementów. –

Powiązane problemy