Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Symbolic Reference in Method Call

by EclecticScion (Novice)
on Jun 27, 2013 at 17:55 UTC ( #1041061=note: print w/ replies, xml ) Need Help??


in reply to Symbolic Reference in Method Call

Thanks for the replies! Since people have asked what I'm trying to do, I've included a copy of the actual code below.

I have another program that regex-searches lengthy documents and tries to sort the paragraphs into categories based on keywords. The other program colours the text of the various paragraphs based on what category it thinks it fits into, and then human assistants go over the coloured document to check that the categorization is correct. If it isn't, the human assistants change the text colour to the appropriate value manually. The files are in RTF format.

The purpose of the second program is to take the correctly-coloured document and split in into six new files (one for each category). The code I have written effectively (although inelegantly) identifies the text colour of each paragraph. I then want to write the text of the paragraph to the appropriate file, based on the text colour of the paragraph.

use diagnostics; use File::Slurp; use RTF::Writer; my @destinations = ('IAs','Defs','Term','Payoffs','RWs','Boilerplate2' +); my $targetfolder = "contract/new2"; opendir(DIR, "$targetfolder"); my @files = readdir(DIR); closedir(DIR); my $count = 0; foreach $file (@files) { if ($file =~ /rtf/i) { my $IAs = RTF::Writer->new_to_file("contract/IAs/$file") +; my $Defs = RTF::Writer->new_to_file("contract/Defs/$file +"); my $Term = RTF::Writer->new_to_file("contract/Term/$file +"); my $Payoffs = RTF::Writer->new_to_file("contract/Payoffs +/$file"); my $RWs = RTF::Writer->new_to_file("contract/RWs/$file") +; my $Boilerplate2 = RTF::Writer->new_to_file("contract/Bo +ilerplate2/$file"); my $contract = read_file("$targetfolder/$file"); my @paragraphs = split('cf', $contract); foreach $clause (@paragraphs) { my @lines = split("\n", "$clause"); if ($lines[0] =~ /^\d$/){ my $colour = $lines[0]; my $goal = \${$destinations["$colour"]}; #P +ROBLEM CODE my $destinationfolder = ("contract/$goal"); foreach $line (@lines) { if ($line =~ /^\s*\w/ && $line !~ /^\d$ +/){ ${$goal}->paragraph ( "$line", ); } } } } } $count++; }

Essentially, I want to fix the line marked "#PROBLEM CODE", above. I'm going to go over the replies and links above to see if I can figure out a solution. Thanks again!


Comment on Re: Symbolic Reference in Method Call
Download Code
Re^2: Symbolic Reference in Method Call
by kennethk (Monsignor) on Jun 27, 2013 at 18:27 UTC
    You are quite close to a clean (IMHO) solution here. Rather than using symbolic references, I would just use a hash to store the writer references:
    use diagnostics; use File::Slurp; use RTF::Writer; my @destinations = ('IAs','Defs','Term','Payoffs','RWs','Boilerplate2' +); my $targetfolder = "contract/new2"; opendir(DIR, "$targetfolder"); my @files = readdir(DIR); closedir(DIR); my $count = 0; foreach $file (@files) { if ($file =~ /rtf/i) { my %writer; for my $dest (@destinations) { $writer{$dest} = RTF::Writer->new_to_file("contract +/$dest/$file"); } my $contract = read_file("$targetfolder/$file"); my @paragraphs = split('cf', $contract); foreach $clause (@paragraphs) { my @lines = split("\n", "$clause"); if ($lines[0] =~ /^\d$/){ my $colour = $lines[0]; my $goal = $writer{$destinations[$colour]}; + #NO-LONGER-PROBLEMATIC CODE my $destinationfolder = ("contract/$destinations +[$colour]"); # Also changed this one foreach $line (@lines) { if ($line =~ /^\s*\w/ && $line !~ /^\d$ +/){ $goal->paragraph ( "$line", ); } } } } } $count++; }
    Untested, though it passes strict. I think there are some simplifications you could make in the logic in your @lines loop as well.

    Remember that objects are just a subclass of scalars; and consider perusing perlreftut and perllol.


    #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

      I had some trouble for a while with a bug relating to my first program, but I can now confirm that the above code works perfectly. Thanks very much!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1041061]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2014-09-24 04:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (245 votes), past polls