loris has asked for the wisdom of the Perl Monks concerning the following question:

Hello brethern and sisthren,

Sorry about the ropey title - I couldn't think of anything snappier.

I have a set of test cases defined as blocks of paramater-value pairs. There are (as yet) two types of block, say, A and B:

# A type A block block_type=A block_id=1 magic=true unlikeliness=2 # Another type A block block_type=A block_id=2 magic=false unlikeliness=9 # A type B block block_type=B block_id=1 colour=green warty=false horns=1 # Another type B block block_type=B block_id=2 colour=red warty=false horns=7 # A further type B block block_type=B block_id=3 colour=red warty=true horns=1

A test case is defined by a combination of the parameters from an A and a B block. I would like to be able to compare test cases.

My approach would be to read the file line for line, work out if the line belongs to the current block, and store the data for a block in a hash, thus producing two arrays of hashes. For each B-block I could obtain the appropriate A-block and create a hash for the test case. Then I could compare test cases by comparing hash-values.

However, I sure there is a smarter way to do it. If anyone has any ideas, they would be greatly appreciated.

Thanks,

loris


"It took Loris ten minutes to eat a satsuma . . . twenty minutes to get from one end of his branch to the other . . . and an hour to scratch his bottom. But Slow Loris didn't care. He had a secret . . ."

Replies are listed 'Best First'.
Re: Parsing a file comprising blocks and comparing the blocks
by davorg (Chancellor) on Aug 15, 2006 at 13:09 UTC

    I'm not really sure what you're trying to do, but I'm assuming that it will be easier for you if you can read the blocks into a data structure. This code reads the blocks into a hash of arrays. The keys of the hash are 'A' and 'B' and the blocks are put into the appropriate spot in the arrays depending on their id.

    use strict; use warnings; use Data::Dumper; my %blocks; local $/ = ''; while (<DATA>) { my ($type) = /block_type=(A|B)/; my ($id) = /block_id=(\d+)/; unless ($type && $id) { warn "Invalid block syntax in record $.\n$_\n"; next; } $blocks{$type}[$id] = $_; } print Dumper \%blocks; __DATA__ # A type A block block_type=A block_id=1 magic=true unlikeliness=2 # Another type A block block_type=A block_id=2 magic=false unlikeliness=9 # A type B block block_type=B block_id=1 colour=green warty=false horns=1 # Another type B block block_type=B block_id=2 colour=red warty=false horns=7 # A further type B block block_type=B block_id=3 colour=red warty=true horns=1
    --
    <http://dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg

Re: Parsing a file comprising blocks and comparing the blocks
by lima1 (Curate) on Aug 15, 2006 at 12:18 UTC
    I do not understand why it is necessary to distinguish between two different blocks. does "appropriate" mean that the block_ids must be the same? if yes, why not
    # A type A block block_id=1 magic=true unlikeliness=2 colour=green warty=false horns=1
    It would simplify the parsing. Otherwise (I assume you then compare the blocks pairwise), then your array of hashes approach seems to be the best choice. Maybe some of the myriad of Config::* modules on cpan could help.

      The separation into different block types is because there are far fewer of Type A than of Type B. Thus, the actual test cases could be:

      A1-B1 A1-B2 A1-B3 ... A1-B99 A2-B1 ... A2-B999

      So the blocks types form a hierarchy. I hope that makes the problem clearer.

      In any case, thanks for the hint about the Config::* modules - I hadn't been aware of them.

      loris


      "It took Loris ten minutes to eat a satsuma . . . twenty minutes to get from one end of his branch to the other . . . and an hour to scratch his bottom. But Slow Loris didn't care. He had a secret . . ."