http://qs1969.pair.com?node_id=770731


in reply to Re: How do I obtain a list of values for all the properties of a Word document using Win32::OLE?
in thread How do I obtain a list of values for all the properties of a Word document using Win32::OLE?

I understand what you're saying, but I would appreciate some clarification on a couple things...
You mentioned that Win32::OLE doesn't perform the checks, but that Data::Dumper does. However, if I understand my own code (unlikely, but I have hope), I'm not calling Win32::OLE repeatedly.. I thought I just had one Data::Dumper call, and it took care of the rest.. thus, if it functioned as you say, wouldn't it find the 'infinite' loop?

I suspect I'm not understanding how Data::Dumper works. BTW, above I'm referring to when I just passed $doc straight to Data::Dumper, not when I used the recursive function. Does that make sense?
  • Comment on Re^2: How do I obtain a list of values for all the properties of a Word document using Win32::OLE?

Replies are listed 'Best First'.
Re^3: How do I obtain a list of values for all the properties of a Word document using Win32::OLE?
by ikegami (Patriarch) on Jun 11, 2009 at 19:14 UTC

    Win32::OLE objects aren't copies of the foreign objects. If they were copies, you couldn't affect the remote objects. Each Win32::OLE object is an interface to a remote objects.

    Any fetch from the referenced hash results in a get from the remote object.

    Any change to the referenced hash results in a set in the remote object.

    And yes, you are doing repeated fetches.

    I suspect I'm not understanding how Data::Dumper works.

    It works much like your code, except it doesn't print anything. The output is placed in a string, which is returned when it's done.

      Okay. I can see that now. But.. I'm still at a loss for how to avoid the infinite loop while enumerating all the properties. Any advice?

        Trying to avoid looping entirely might not be possible. I don't see anything in Win32::OLE that would help uniquely identify an object, and that would be required to avoid looping.

        You could put limits on your looping (depth, time, number of objects visited, etc). Doing a breadth-first traversal (rather than a depth-first traversal) will make it easier to produce good results while adding limits.

        sub depth_first { my ($n) = @_; for ($n->children()) { depth_first($_); } } sub breadth_first { my @todo = @_; while (@todo) { my $n = shift(@todo); push @todo, $n->children(); } }