For Programmers: Free Programming Magazines  


Home > Archive > PERL Modules > July 2006 > Text::Diff usage question









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Text::Diff usage question
Ronald Fischer

2006-07-17, 7:56 am

I would like to compare two arrays of lines. If the arrays
are different, I want to output the differences in human-readable
form, and also call a function f().

I think that Text::Diff, found on CPAN, would useful. Indeed it
works, but my code looks a bit cumbersome and I wonder whether
one can make it easier:

# Compare the arrays
my @status_diff=Text::Diff::diff(\@after,\@
before);

unless(@status_diff eq 0
|| (@status_diff eq 1 and length($status_diff[0]) eq 0))
{
# Lines differ
print(@status_diff); # print differences
f() # call f
}

What looks a bit complicated is the condition inside the "unless".
Even on identical arrays, diff returns an array of 1 string of
zero length. But I can't simplify it to, say

if(length($status_diff[0])) { print(...); f() }

because I could imagine that there are cases where diff
returns an empty list or even undef (I didn't find anything
in the diff documentation which guarantees that the output
is always an array of at least one string, when the default
formatter is used - or did I overlook something here in the
docs?).

Any suggestion how I could write this in a better way?

Ronald

--
Ronald Fischer <ronaldf@eml.cc>
Posted via http://www.newsoffice.de/

DJ Stunks

2006-07-19, 3:57 am

Ronald Fischer wrote:
> I would like to compare two arrays of lines. If the arrays
> are different, I want to output the differences in human-readable
> form, and also call a function f().
>
> I think that Text::Diff, found on CPAN, would useful. Indeed it
> works, but my code looks a bit cumbersome and I wonder whether
> one can make it easier:
>
> # Compare the arrays
> my @status_diff=Text::Diff::diff(\@after,\@
before);
>
> unless(@status_diff eq 0
> || (@status_diff eq 1 and length($status_diff[0]) eq 0))
> {
> # Lines differ
> print(@status_diff); # print differences
> f() # call f
> }
>
> What looks a bit complicated is the condition inside the "unless".
> Even on identical arrays, diff returns an array of 1 string of
> zero length. But I can't simplify it to, say
>
> if(length($status_diff[0])) { print(...); f() }
>
> because I could imagine that there are cases where diff
> returns an empty list or even undef (I didn't find anything
> in the diff documentation which guarantees that the output
> is always an array of at least one string, when the default
> formatter is used - or did I overlook something here in the
> docs?).


I don't know what docs you have, but mine say:

[Synopsis] my $diff = diff \@records1, \@records2;
and
[Output] If no OUTPUT is supplied, returns the diffs in a string

which leads me to believe your array will only ever have one element -
it just may or may not be defined.

-jp

ro.naldfi.scher@gmail.com

2006-07-19, 3:57 am

DJ Stunks schrieb:
>
> I don't know what docs you have, but mine say:
>
> [Synopsis] my $diff = diff \@records1, \@records2;
> and
> [Output] If no OUTPUT is supplied, returns the diffs in a string
>
> which leads me to believe your array will only ever have one element -
> it just may or may not be defined.


I overlooked this. Thank you for pointing it out.

This makes the comparision a little bit simpler,
although it would be better IMO if the docs ensure exactly how
the result will look like when the arrays are equal (from the code
you can see that the output will be the string "" in such a case,
but this is not the same as documenting this fact - because if
it is documented, one can expect it to be part of the interface
and that it will stay the same in future versions of this module).

Ronald

DJ Stunks

2006-07-19, 6:58 pm


ro.naldfi.scher@gmail.com wrote:
> DJ Stunks schrieb:
>
> I overlooked this. Thank you for pointing it out.
>
> This makes the comparision a little bit simpler,
> although it would be better IMO if the docs ensure exactly how
> the result will look like when the arrays are equal (from the code
> you can see that the output will be the string "" in such a case,
> but this is not the same as documenting this fact - because if
> it is documented, one can expect it to be part of the interface
> and that it will stay the same in future versions of this module).


the comparison is much simpler: if ( $diff ne q{} ) { #different...

I agree the module documentation should be updated to include the
return value of diff(). You should contact Barry and let him know.

-jp

>
> Ronald


Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com