Reference two dimensional array in Perl sub


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Reference two dimensional array in Perl sub
# 1  
Old 04-14-2003
Reference two dimensional array in Perl sub

I am trying to reference a two dimensional array in a
subroutine and can't seem to figure this one out in Perl.

Does anybody know? Please enlighten me.

Code:
#!/usr/bin/perl -w

use constant DIM => 4;

sub Shift_elements_right{
    my (@Input, @Output) = @_;
    for ($i = 0 ; $i <= DIM ; $i++ ){
	$Output[$i + 1] = $Input[$i];
    }
    $Output[1] = $Input[DIM];
}


# Initialize
for ($i = 0; $i <= DIM; $i++){
    $weight[0][$i] = $i;
}

# Shift call
for ($i = 0; $i <= DIM; $i++){
    Shift_elements_right(\@weight[$i], \@weight[$i + 1]);
}

# Print output.
for ($i = 0; $i <= DIM; $i++){
    for ($j = 0; $j <= DIM; $j++){
	print "Weight $i : $weight[$i][$j]\t";
    }
    print "\n";
}

# 2  
Old 04-15-2003
Could you explain a little more about what you're trying to do?

I can pick out some of what you're doing, but I'm not sure why.. if you explain the what and why of your situation, it'll help us help you out..
# 3  
Old 04-15-2003
This is actually a more complex Pascal program I
am converting to Perl. The code given is a smaller
example of a larger program.

In pascal the program code looks like this:

Code:
CONST DIM = 4;
TYPE Vector = ARRAY [1..DIM] of REAL;
weights: ARRAY[1..DIM] of Vector;

PROCEDURE Initialize;
	VAR I: INTEGER;

	BEGIN
	FOR I := 1 TO DIM DO
		weights[1][I] := I;
	END



PROCEDURE Shift_elements_right (Input : Vector;
				VAR Output: Vector);
	VAR I: INTEGER;
	
	BEGIN
	FOR I := 1 TO DIM DO
		Output[I+1] := Input[I];
	Ouptut[1] := Input[DIM];
	END

BEGIN
FOR I := 1 TO DIM DO
	Shift_elements_right(weights[I], weights[I+1]);
END;


It is supposed to create a 4 x 4 dimensional array with only
the first row of vector being initialized.

My question is to reproduce this in Perl. I would like to
pass the array as a reference and put values in the 4 x 4
dimentional array through a subroutine.

Odviously I can do this without a subroutine but with a
larger program this is not practicle.
# 4  
Old 04-15-2003
To initialize the two-dimensional array, you could do something like:
Code:
@array1 = ('0', '0', '0', '0');
@array2 = ('0', '0', '0', '0');
@array3 = ('0', '0', '0', '0');
@array4 = ('0', '0', '0', '0');

@bigArray = (\@array1, \@array2, \@array3, \@array4);

or to simplify, try this (I think it'll work):
Code:
@bigArray = ( ['0', '0', '0', '0'],
              ['0', '0', '0', '0'],
              ['0', '0', '0', '0'],
              ['0', '0', '0', '0']
);

Then to reference a particular value, you can use:
Code:
$bigArray[0][0]; # first row, first column
$bigArray[2][1]; # third row, second column

To store a value, use:
Code:
$bigArray[2][1] = '5'

or, in a subroutine:
Code:
for ($i = 0; $i < DIM; $i++){
    for ($j = 0; $j < DIM; $j++){
        bigArray[$i][$j] = $j; #assuming $j is the value you want to store...
    }
}

Let me know what works and what doesn't...
# 5  
Old 04-15-2003
The following code seems to solve my problem.

Code:
#!/usr/bin/perl -w

use constant DIM => 4;

sub Shift_elements_right{
    my ($ref) = shift;
    for($j = 1 ; $j <= DIM ; $j++){
	for ($i = 1 ; $i <= DIM ; $i++ ){
	    $ref->[$j + 1][$i + 1] = $ref->[$j][$i];
	}
    $ref->[$j + 1][1] = $ref->[$j][DIM];
    }
}


# Initialize
for ($i = 1; $i <= DIM; $i++){
	$weights[1][$i] = $i;
}

# Shift call
Shift_elements_right(\@weights);

# Print output.
for ($i = 1; $i <= DIM; $i++){
    for ($j = 1; $j <= DIM; $j++){
	print "Weight $i : $weights[$i][$j]\t";
    }
    print "\n";
}

# 6  
Old 04-16-2003
Quote:
snip of sample code
FOR I := 1 TO DIM DO
weights[1][I] := I;
END
If you want to keep your Perl code similar to the original, I believe you can do things like the above, in this way:
Quote:
foreach $I (1..DIM) {
# process $I here
}
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Assign Two Dimensional Array In Bash At Once

Hi, I have a 10*10 two dimensional array. How do I assign value to all it's 100 elements at once? I don't want to open two for loops and assign one by one. Thanks, Shuri (1 Reply)
Discussion started by: shurimano
1 Replies

2. Shell Programming and Scripting

Multi Dimensional array

I have an array of names. Each one of the name, has a number represented to it. For example A has an ID 8, B has an ID 2. What I am after is a for loop that when the array is in position 1, a particular variable is set to the value of position 1 in array 2 declare -a arr=("A" "B" "C"... (6 Replies)
Discussion started by: nms
6 Replies

3. Shell Programming and Scripting

How to reference 2 dimensional array in awk?

Hello, all For a 1-dimensional array, such as myarr_1=1 myarr_1=2 myarr_1=3I know I can write a loop as below to show the array member one by one: for (i in myarr_1){print i, myarr_1}Now, suppose I have a two dimensional array such as: myarray_2=1 myarray_2=2 myarray_2=10 myarray_2=20My... (3 Replies)
Discussion started by: littlewenwen
3 Replies

4. Shell Programming and Scripting

Store in a 2 dimensional array - Perl

Hey guyz. Here is my sample input file following by first part of my code: * A B C D E reg1 1 0 1 1 0 reg2 0 1 0 0 1 reg3 1 0 0 1 0 reg4 0 0 1 0 1 reg5 1 1 0 0 1 use strict; use warnings; open (IN, "test_input.txt") or die ("Can't open file.txt: $!\n"); my $line = <IN>; ... (2 Replies)
Discussion started by: @man
2 Replies

5. Shell Programming and Scripting

Manipulating a list into a two-dimensional array

hi, total newbie to shell scripting and wondering if some of you guru's can give me a hand on a problem I'm trying to solve. The tmplsnr.a file contains LSNR_51526 db1 db2 LSNR_51527 db3 db4 db5 Summary - depending on which db is set, the script will start the relevant listener... (5 Replies)
Discussion started by: mingy10
5 Replies

6. Programming

Return two dimensional array in c++

I am writing matrix multiplication and trying to return a two dimensional array from a function but I keep getting errors. Can someone please help me? here is my code (it is just the skeleton of my program): void main () { ... int *matmultiply (int, int, int, int , int , int ) ... } ... (4 Replies)
Discussion started by: saboture88
4 Replies

7. Shell Programming and Scripting

sorting multi dimensional array

Hi there, Can someone let me know how to sort the 2 dimensional array below by column 1 then by column 2? 22 55 2222 2230 33 66 44 58 222 240 11 25 22 60 33 45 output: 11 25 22 55 22 60 33 45 33 66 44 58 (6 Replies)
Discussion started by: phoeberunner
6 Replies

8. Shell Programming and Scripting

PHP: Search Multi-Dimensional(nested) array and export values of currenly worked on array.

Hi All, I'm writing a nagios check that will see if our ldap servers are in sync... I got the status data into a nested array, I would like to search key of each array and if "OK" is NOT present, echo other key=>values in the current array to a variable so...eg...let take the single array... (1 Reply)
Discussion started by: zeekblack
1 Replies

9. Shell Programming and Scripting

2 dimensional array in unix

I am trying to implementing two dimensinal array in ksh script.Would you pls help me out. I have a large size of file, File contains looks like ID SID VLAUE1 VALUE2 TOTALVALUE 1 a1 01 02 03 1 b1 02 05 07 ... (2 Replies)
Discussion started by: pritish.sas
2 Replies

10. Shell Programming and Scripting

Help for record (2 dimensional array.)

I am going to develop a address book using the shell scripting commands without sed, awk, .... I am thinking to apply the concept of 2 dimenstional array. Can I create a two dimensional array for the insertion/updation/deletion of record in unix. If yes then tell me plz or recommend me some... (1 Reply)
Discussion started by: murtaza
1 Replies
Login or Register to Ask a Question