insert codes dynamically

R

Rose

I have to add objects dynamically in a code and therefore the number of
objects are not known beforehand. How to achieve this effectly in a simple
way? e.g.

#fixed codes

$panel = Panel->new(
-length => 1000,
-width => 10,
);

#dynamic codes

my $obj1 = Object::Generic->new(
-start => 10,
-end => 10,
-display_name => 'C'
);

my $obj2 = Object::Generic->new(
-start => 88,
-end => 89,
-display_name => 'T'
);

....

my $objn = Object::Generic->new(
-start => p,
-end => q,
-display_name => 'N'
);



$panel->add_obj($obj1);
$panel->add_obj($obj2);
....
$panel->add_obj($objn);
 
R

Rose

Frank Seitz said:
Rose said:
I have to add objects dynamically in a code and therefore the number of
objects are not known beforehand. How to achieve this effectly in a
simple
way? e.g.

my $panel = Panel->new(...);

my @arr = ([10,10,'C'],[88,89,'T'],...);
for my $e (@arr) {
my $obj = Object::Generic->new(
-start=>$e->[0],
-end=>$e->[1],
-display_name=>$e->[2],
);
$panel->add_obj($obj);
}

Frank

Frank, Thanks a lot for your response. Indeed, @arr is not known beforehand
and the content of @arr is generated by another perlscript. How would you
recommend to bridge these 2 perlscripts? The first one, I store the 10, 88,
....; 10, 89, ...; and C, T, ... into separate arrays, say @a1, @a2, @a3. A
simple but dirty way is to copy the contents of the 1st file to the 2nd and
then @arr = (@a1, @a2, @a3), but this does not look to be a good practice.
 
R

Rose

Frank Seitz said:
Rose said:
Frank, Thanks a lot for your response. Indeed, @arr is not known
beforehand
and the content of @arr is generated by another perlscript. How would you
recommend to bridge these 2 perlscripts? The first one, I store the 10,
88,
...; 10, 89, ...; and C, T, ... into separate arrays, say @a1, @a2, @a3.
A simple but dirty way is to copy the contents of the 1st file to the 2nd
and
then @arr = (@a1, @a2, @a3), but this does not look to be a good
practice.

To copy @a1, @a2, @a3 this way would not work.
Copying is not necessary. Try this:

for (my $i = 0; $i < @a1; $i++) {
my $obj = Object::Generic->new(
-start=>$a1[$i],
-end=>$a2[$i],
-display_name=>$a3[$i],
);
$panel->add_obj($obj);
}

Frank

But can I use a for loop to achieve the following effect? I guess I can't
simply code:
$panel->add_track([@obj],
-label => 1,
);

$panel->add_track([$obj1,$obj2,$obj3, ..., $objn],
-label => 1,
);
 
R

Rose

Frank Seitz said:
Rose said:
But can I use a for loop to achieve the following effect? I guess I can't
simply code:
$panel->add_track([@obj],
-label => 1,
);

$panel->add_track([$obj1,$obj2,$obj3, ..., $objn],
-label => 1,
);

Can't tell. What expects add_track() as second parameter?
(first parameter is the ref to the panel-Object)

Frank

It can accept a number of objects $obj1,$obj2, ..., $objn in square
brackets. the problem is that "n" is unknown beforehand, and therefore can't
be hard-coded. I know that in Matlab a function called repmat may help...
 
B

Ben Morrow

[please don't quote signatures]

Quoth "Rose said:
Frank Seitz said:
Rose said:
But can I use a for loop to achieve the following effect? I guess I can't
simply code:
$panel->add_track([@obj],
-label => 1,
);

$panel->add_track([$obj1,$obj2,$obj3, ..., $objn],
-label => 1,
);

Can't tell. What expects add_track() as second parameter?
(first parameter is the ref to the panel-Object)

It can accept a number of objects $obj1,$obj2, ..., $objn in square
brackets. the problem is that "n" is unknown beforehand, and therefore can't
be hard-coded. I know that in Matlab a function called repmat may help...

If you have an array

@obj = (1, 2, 3, 4);

then the expression

[1, 2, 3, 4]

is exactly equivalent to

[@obj]

.. This is generally true: whenever you have a series of comma-separated
items in list context, you can insert an array into the list and it will
be interpolated. The exception is the argument lists of functions like
'push' which have prototypes and so treat literal arrays specially.

Under many circumstances, it would be better to use

\@obj

as this doesn't make a copy of the array. You can do this if you know
the function you are calling doesn't modify the passed-in array (or if
you don't care if it trashes @obj).

Note that @obj is *not* equivalent to

$obj1, $obj2, $obj3, ...

if you were thinking that; $obj[1] is not the same as $obj1. If those
variables weren't just an example, they should have been in an array to
start with.

I would suggest you read perldoc perldsc and perldoc perlreftut.

Ben
 
C

ccc31807

my $panel = Panel->new(...);
my @arr = ([10,10,'C'],[88,89,'T'],...);
for my $e (@arr) {
my $obj = Object::Generic->new(
-start=>$e->[0],
-end=>$e->[1],
-display_name=>$e->[2],
);
$panel->add_obj($obj);
}

Frank, Thanks a lot for your response. Indeed, @arr is not known beforehand
and the content of @arr is generated by another perlscript. How would you
recommend to bridge these 2 perlscripts? The first one, I store the 10, 88,
...; 10, 89, ...; and C, T, ... into separate arrays, say @a1, @a2, @a3. A
simple but dirty way is to copy the contents of the 1st file to the 2nd and
then @arr = (@a1, @a2, @a3), but this does not look to be a good practice.

In the first script, write the array to a text file, values space
separated with each list on a new line, like this:
20 30 A
40 50 B
60 70 C
... etc

In the second script, read in the file line by line and recreate the
data structure possibly as an array composed of array references.

I assume that you can read and write to a text file in your directory,
and that you will overwrite the same file each day so you can use
static file names.

CC
 
B

Ben Morrow

Quoth "Rose said:
Frank, Thanks a lot for your response. Indeed, @arr is not known beforehand
and the content of @arr is generated by another perlscript. How would you
recommend to bridge these 2 perlscripts?

Do they need to be separate scripts? Are they run at different times? If
you are using separate scripts simply as a way of putting the code in
separate files, you may want to use modules instead.

The easy and straightforward way to pass data from Perl to Perl is the
use the Storable module, which is core as of 5.8. In the first script
you say

use Storable qw/store/;

store \@arr, 'file' or die "store failed";

and then in the second

use Storable qw/retrieve/;

my $aref = retrieve 'file' or die "retrieve failed";

If you want the data to be human-readable, or readable from another
language, you could use YAML instead.

Ben
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top