[26719] in Perl-Users-Digest

home help back first fref pref prev next nref lref last post

Perl-Users Digest, Issue: 8814 Volume: 10

daemon@ATHENA.MIT.EDU (Perl-Users Digest)
Sat Dec 31 21:05:26 2005

Date: Sat, 31 Dec 2005 18:05:03 -0800 (PST)
From: Perl-Users Digest <Perl-Users-Request@ruby.OCE.ORST.EDU>
To: Perl-Users@ruby.OCE.ORST.EDU (Perl-Users Digest)

Perl-Users Digest           Sat, 31 Dec 2005     Volume: 10 Number: 8814

Today's topics:
    Re: My Regexp  XML Parser -> Structured Perl Data, Cut  robic0
        Net::FTP can't locate object method "new" <hjs@cadence.com>
    Re: Net::FTP can't locate object method "new" (Anno Siegel)
    Re: Ordering string of commands in a file <tadmc@augustmail.com>
        Digest Administrivia (Last modified: 6 Apr 01) (Perl-Users-Digest Admin)

----------------------------------------------------------------------

Date: Sat, 31 Dec 2005 15:23:19 -0800
From: robic0
Subject: Re: My Regexp  XML Parser -> Structured Perl Data, Cut & Paste Version, No Module's (Vol I)
Message-Id: <q34er19ammsgatdkd7o5523p77rn6fm52l@4ax.com>

On Tue, 20 Dec 2005 23:59:06 -0800, robic0 wrote:

Version .903
Added a new flag:

- KeepContentOrder

Attributes are not kept in order. I could 
easily do it if its really usefull, however
it would extend the containing tag out another
array level.

The output is truncated to save space, it is 
ActiveState's Perl 5.6 release html file.

Let me know if you have any questions.
-robic0-


print <<EOM;

# -----------------------
# XML Regex Parser
# Version .903 - 12/31/05 
# Copyright 2005,
# by robic0-At-yahoo.com
# -----------------------
EOM

use strict;
use warnings;
use Data::Dumper;

open DATA, "CHANGES56.html" or die "can't open CHANGES56.html...";
my $gabage1 = join ('', <DATA>);
close DATA;

my @xml_strings = ($gabage1);

my $alt_debug = 0;
my $VERSION          = .903;
my $debug            = 0;
my $rmv_white_space  = 0;
my $ForceArray       = 0;
my $KeepRoot         = 1;
my $KeepComments     = 1;
my $KeepContentOrder = 1;

## -- XML, start & end regexp substitution delimiter chars --
##            match side , substitution side
## -------------------------/-------------------------------
my (@S_dlim, @E_dlim);
if ($debug) {
	@S_dlim = ('\['     , '[');      # use these for debug
	@E_dlim = ('\]'     , ']');
} else {
	@S_dlim = (chr(140) , chr(140)); # use these for production
	@E_dlim = (chr(141) , chr(141));
}

## -- Process xml data --
##
for (@xml_strings)
{
	print "\n",'*'x30,"\nXML string:\n",'-'x15,"\n$_\n\nOutput:\n",'-'x15,"\n\n";
	if ($alt_debug) {
		ProcessAltDebugInfo ($_) ;
		print "\n";
	}
	my $ROOT = {};   # container
	my %cdata_elements = ();
	my ($last_cnt, $cnt, $i, $attr_error) = (-1, 1, 0, 0); 

	## Comment/CDATA block ==================================
	#### To be done first -
	# -- Questionable Comments --
	while (s/(<!--(.*?)-->)/$S_dlim[1]$cnt$E_dlim[1]/s) {
		#print "$cnt  =  Questionable comment:  $1\n" if ($debug);
		$ROOT->{$cnt} = $1;
		$cnt++;
	}
	#### To be done second -
	# -- Real CDATA --
	while (s/<!\[CDATA\[(.*?)\]\]>/$S_dlim[1]$cnt$E_dlim[1]/s)
	{
		# reconstitute cdata contents
		my $cdata_contents = $1;
		my $str = '';
		while ($cdata_contents =~ s/([^$S_dlim[0]$E_dlim[0]]+)|$S_dlim[0]([\d]+)$E_dlim[0]//) {
			if (defined $1) {
				$str .= $1;
			} elsif (defined $2 && exists $ROOT->{$2}) {
				$str .= $ROOT->{$2};
				delete $ROOT->{$2};
			} else {} # shouldn't get here
		}
		print "$cnt  CDATA = $str\n" if ($debug);
		$ROOT->{$cnt} = $str;
		$cdata_elements{$cnt} = '';
		$cnt++;
	}
	#### To be done third -
	# -- Real Comments are left --
	foreach my $key (sort {$a <=> $b} keys %{$ROOT}) {
		if (!exists $cdata_elements{$key}) {
			$ROOT->{$key} =~ s/^<!--(.*?)-->$/$1/s; 
			print "$key Comment = $1\n" if ($debug);
			if ($KeepComments) {
				$ROOT->{$key} = { comment => $1 };
			} else {delete $ROOT->{$key};}
		}
	}
	## End Comment/CDATA block ==============================

	#### Non-tag markups go here -
	####

	# -- Versioning -- <?XML-Version ?> - Placeholder, voided
	while (s/<\?([^<>]*)\?>//) {
	#while (s/<\?([^<>]*)\?>/$S_dlim[1]$cnt$E_dlim[1]/) {
		print "$cnt <? ?> = $1\n" if ($debug);
		$ROOT->{$cnt} = { 'XMLV' => $1 };
		$cnt++;
	}
	# -- DOCTYPE -- <!DOCTYPE info> - Placeholder, voided
	while (s/<!DOCTYPE([^<>]*)>//) {
	#while (s/<!DOCTYPE([^<>]*)>/$S_dlim[1]$cnt$E_dlim[1]/) {
		print "$cnt DOCTYPE = $1\n" if ($debug);
		$ROOT->{$cnt} = { 'DOCTYPE' => $1 };
		$cnt++;
	}
	#### White space removal before tags ? .. TBD -
	if ($rmv_white_space) {
		s/>[\s]+</></g;
		s/[\s]+</</g;
		s/>[\s]+/>/g;
	}

	#### Tags here - should only need 2 iterations max
	my $finished = 0;
	while ($cnt != $last_cnt && $i < 20)
	{
		$last_cnt = $cnt;

		## <Tag/> , no content
		while (s/<([0-9a-zA-Z]+)\/>/$S_dlim[1]$cnt$E_dlim[1]/) {
			print "$cnt <$1> = \n" if ($debug);
			$ROOT->{$cnt} = { $1 => '' };
			$cnt++;
		}
		## <Tag Attributes/> , no content
		while (s/<([0-9a-zA-Z]+)([\s]+[0-9a-zA-Z]+[\s]*=[\s]*["'][^<]*['"])+[\s]*\/>/$S_dlim[1]$cnt$E_dlim[1]/) {
			print "$cnt <$1> = attr: $2\n" if ($debug);
			my $hattrib  = getAttrHash($2);
			if (ref($hattrib) ne "HASH") {
				print "Invalid token in attribute asignment:\n$hattrib\n"; $attr_error = 1; last;
			}
			$ROOT->{$cnt} = { $1 => $hattrib };
			$cnt++;
		}
		## <Tag> Content </Tag>
		while (s/<([0-9a-zA-Z]+)>([^<]*)<\/\1>/$S_dlim[1]$cnt$E_dlim[1]/) {
			print "$cnt <$1> = $2\n" if ($debug);
			my $unknown = '';
			if (length($2) > 0) {
				my $hcontent = getContentHash($2, $ROOT, \%cdata_elements);
				$unknown = $hcontent;
				if (keys (%{$hcontent}) > 1) {
					 if (!$ForceArray) { adjustForSingleItemArrays ($hcontent); }
				} else {
					if (exists $hcontent->{'content'}) 
					{
						my ($key);
						if (!$ForceArray ) {
							if (ref($hcontent->{'content'}) eq "ARRAY" && scalar(@{$hcontent->{'content'}}) == 1) {
								$unknown = ${$hcontent->{'content'}}[0];
							}
							else {$unknown = $hcontent->{'content'}; }
						}
					}
					if (!$ForceArray) { adjustForSingleItemArrays ($hcontent); }
				}
			}
			$ROOT->{$cnt} = { $1 => $unknown };
			$cnt++;
		}
		last if ($attr_error);
		## <Tag Attributes> Content </Tag>
		while (s/<([0-9a-zA-Z]+)([\s]+[0-9a-zA-Z]+[\s]*=[\s]*["'][^<]*['"])+[\s]*>([^<]*)<\/\1>/$S_dlim[1]$cnt$E_dlim[1]/) {
			print "$cnt <$1> = attr: $2, content: $3\n" if ($debug);
			my $hattrib  = getAttrHash($2);
			if (ref($hattrib) ne "HASH") {
				print "Invalid token in attribute asignment:\n$hattrib\n"; $attr_error = 1; last;
			}
			if (length($3) > 0) {
				my $hcontent = getContentHash($3, $ROOT, \%cdata_elements);
				if (!$ForceArray) { adjustForSingleItemArrays ($hcontent); }
				while (my ($key,$val) = each (%{$hcontent})) {
					$hattrib->{$key} = $val;
				}
			}
			$ROOT->{$cnt} = { $1 => $hattrib };
			$cnt++;
		}
		last if ($attr_error);
		if ($last_cnt != $cnt) {
			$i++; print "** End pass $i\n" if ($debug);
		} else {
			last if ($finished);
			## Encapsulate the xml with a "root"
			$_ = "<root>$_</root>";
			$last_cnt--;
			$finished = 1;
		}
	}
	next if ($attr_error);
	if (/<|>/) {
		print "($i) XML problem:  malformed, syntax or tag closure:\n$_";
	} else {
		print "** Itterations      = $i\n".
		      "** Debug            = $debug\n".
		      "** Rmv white space  = $rmv_white_space\n".
		      "** ForceArray       = $ForceArray\n".
		      "** KeepRoot         = $KeepRoot\n".
                      "** KeepComments     = $KeepComments\n".
		      "** KeepContentOrder = $KeepContentOrder\n";
		#print Dumper($ROOT);
		print "The remaining string is:\n$_\n\n" if ($debug);

		## Strip off the outer element (our root) to
		## examine the contents for errors.
		## ---------------------------------------
		my $outer_element = $cnt-1;
		if (exists $ROOT->{$outer_element})
		{
			my $hroot = $ROOT->{$outer_element};
			my ($key,$val) = each (%{$hroot});
			my $htodump = $val;

			# check for errors in root
			if (ref($htodump) ne "HASH" || (!$KeepContentOrder && exists $htodump->{'content'})) {
				my $msg = 'Error';
				$msg = 'Warning' if ($KeepContentOrder);
				print "$msg, bare content at root level ..\n";
			} else {
				my $dmp_keys = keys (%{$htodump});

				if ($dmp_keys > 1) {
					print "Warning, multiple elements at root level ..\n";
				} else {
					($key,$val) = each (%{$htodump});
					my $val_type = ref($val);

					if ($dmp_keys == 0 || (exists $htodump->{'comment'})) {
						print "Warning, no elements at root level ..\n";
					}
					if ($dmp_keys == 1) {
						if ($val_type eq "HASH") {
							$htodump = $val if (!$KeepRoot);
						}
						elsif ($val_type eq "ARRAY") {
							$htodump = $val if (!$KeepRoot && $KeepContentOrder);
							if (!$ForceArray || scalar(@{$val}) > 1) {
								print "Warning, multiple elements at root level ..\n";
							}
						}
					}
				}
			}
			print "\n";
			my $tmp = undef;
			if (ref($htodump) eq "HASH") {
				$tmp = {};
				%{$tmp} = %{$htodump};
			} elsif (ref($htodump) eq "ARRAY") {
				$tmp = [];
				@{$tmp} = @{$htodump};
			} else {
				print "Not a hash or array!\n";
			}
			print Dumper($tmp) if (defined $tmp);
		} else {
			print "nothing to output!\n";
		}
	}
}
##
sub adjustForSingleItemArrays
{
	my $href = shift;
	## if $val is an array ref and has one element
	## set $href->{$key} equal to the element
	while (my ($key,$val) = each (%{$href})) {
		if (ref($val) eq "ARRAY") {
			if (scalar(@{$val}) == 1) {
				$href->{$key} = $val->[0];
			}
		}
	}
}
##
sub getAttrHash
{
	my $attrstr = shift;
	my $ahref = {};
	return $ahref unless (defined $attrstr);
	while ($attrstr =~ s/[\s]*([0-9a-zA-Z]+)[\s]*=[\s]*("|')([^=]*)\2[\s]*//i) {
		$ahref->{$1} = $3;
	}
	if ($attrstr=~/=/) {
		$attrstr =~ s/^\s+//s;
		$attrstr =~ s/\s+$//s;
		return $attrstr 
	}
	return $ahref;
}
##
sub getContentHash
{
	my ($contstr,$hStore,$hcdata_elements) = @_;
	my $ahref = {};
	return $ahref unless (defined $contstr && defined $hStore && defined $hcdata_elements);
	my @ary = ();
	my $append_flag = 0;

	while ($contstr =~ s/^([^<$S_dlim[0]$E_dlim[0]]+)|$S_dlim[0]([\d]+)$E_dlim[0]//s)
	{
		## -- $1 is text contents --
		if (defined $1) {
			my $tmp1 = $1;
			# if flagged, append it to $ary[last]
			if ($append_flag && scalar(@ary) > 0) {
				my $size = scalar(@ary);
				$ary[$size-1] .= $tmp1;
			} else {
				push (@ary, $1);
			}
			$append_flag = 0;
		}
		## -- $2 is substitution index --
		elsif (defined $2) {
			## Exist check (Comments stripped?),
			# turn on append flag.
			# -----------------------------------
			if (!exists $hStore->{$2}) {
				$append_flag = 1;
				next;
			}
			## CDATA check, append it to $ary[last]
			# and turn on append flag.
			# ---------------------------------------
			if (exists $hcdata_elements->{$2}) {
				my $size = scalar(@ary);
				if ($size > 0) {
					$ary[$size-1] .= $hStore->{$2};
				} else {push (@ary, $hStore->{$2});}
				$append_flag = 1;
				next;
			}
			$append_flag = 0;

			## Substitution of in-line content,
			# push it to @ary
			# ----------------------------------
			if ($KeepContentOrder) {
				push (@ary, $hStore->{$2});
				next;
			}
			## Substitution of same level here (normal),
			# just store it to $ahref
			# -----------------------------------------
			my ($key,$val) = each (%{$hStore->{$2}});
			if (exists $ahref->{$key}) {
				push (@{$ahref->{$key}}, $val);
			} else {
				$ahref->{$key} = [$val];
			}
		}
		else {} # shouldn't get here 
	}
	# Store contents, strip out
	# pure whitespace text elements
	my $hary = [];
	for (@ary) {
		next if (/^\s+$/s);
		push (@{$hary}, $_);
	}
	if (scalar(@{$hary}) > 0) {
		$ahref->{'content'} = $hary;
	}
	## if $val is an array ref and has one element and it
	## is a hash ref, set {$key} equal to hash ref
	if (!$ForceArray) {
		while (my ($key,$val) = each (%{$ahref})) {
			if (ref($val) eq "ARRAY") {
				if (scalar(@{$val}) == 1 && ref($val->[0]) eq "HASH") {
					$ahref->{$key} = $val->[0];
				}
			}
		}
	}
	return $ahref;
}

sub ProcessAltDebugInfo
{
}

__END__





# -----------------------
# XML Regex Parser
# Version .903 - 12/31/05 
# Copyright 2005,
# by robic0-At-yahoo.com
# -----------------------

******************************
XML string:
---------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ActivePerl 5.6 Change Log</title>
<link rel="stylesheet" href="Active.css" type="text/css" />
<link rev="made" href="mailto:" />
</head>

<body>

<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->
<!--

<ul>

	<li><a href="#activeperl_5_6_change_log">ActivePerl 5.6 Change Log</a></li>
	<ul>

		<li><a href="#build_638_thursday__apr_15__2004">Build 638 Thursday, Apr 15, 2004</a></li>
		<li><a href="#build_635_thursday__feb_6__2003">Build 635 Thursday, Feb 6, 2003</a></li>
		<li><a href="#build_633_monday__june_17__2002">Build 633 Monday, June 17, 2002</a></li>
		<li><a href="#build_632_monday__june_3__2002">Build 632 Monday, June 3, 2002</a></li>
		<li><a href="#build_631_monday__december_31__2001">Build 631 Monday, December 31, 2001</a></li>
		<li><a href="#build_630_wednesday__october_30__2001">Build 630 Wednesday, October 30, 2001</a></li>
		<li><a href="#build_629_thursday__august_23__2001">Build 629 Thursday, August 23, 2001</a></li>
		<li><a href="#build_628_thursday__july_5__2001">Build 628 Thursday, July 5, 2001</a></li>
		<li><a href="#build_626_thursday__may_1__2001">Build 626 Thursday, May 1, 2001</a></li>
		<li><a href="#build_623_sunday__december_12__2000">Build 623 Sunday, December 12, 2000</a></li>
		<li><a href="#build_622_sunday__november_5__2000">Build 622 Sunday, November 5, 2000</a></li>
		<li><a href="#build_620_sunday__october_29__2000">Build 620 Sunday, October 29, 2000</a></li>
		<li><a href="#build_618_tuesday__september_12__2000">Build 618 Tuesday, September 12, 2000</a></li>
		<li><a href="#build_617_thursday__august_31__2000">Build 617 Thursday, August 31, 2000</a></li>
		<li><a href="#build_616_friday__july_14__2000">Build 616 Friday, July 14, 2000</a></li>
		<li><a href="#build_615_thursday__june_29__2000">Build 615 Thursday, June 29, 2000</a></li>
		<li><a href="#build_613_thursday__march_23__2000">Build 613 Thursday, March 23, 2000</a></li>
		<li><a href="#build_612_wednesday__march_22__2000">Build 612 Wednesday, March 22, 2000</a></li>
		<li><a href="#build_611_wednesday__march_15__2000">Build 611 Wednesday, March 15, 2000</a></li>
		<li><a href="#build_609_wednesday__march_1__2000">Build 609 Wednesday, March 1, 2000</a></li>
		<li><a href="#build_607_friday__february_11__2000">Build 607 Friday, February 11, 2000</a></li>
		<li><a href="#build_606_friday__february_4__2000">Build 606 Friday, February 4, 2000</a></li>
		<li><a href="#build_604_friday__november_26__1999">Build 604 Friday, November 26, 1999</a></li>
		<li><a href="#build_603_tuesday__november_23__1999">Build 603 Tuesday, November 23, 1999</a></li>
		<li><a href="#build_602_thursday__august_5__1999">Build 602 Thursday, August 5, 1999</a></li>
		<li><a href="#build_601_tuesday__july_13__1999">Build 601 Tuesday, July 13, 1999</a></li>
		<li><a href="#what_s_new_in_the_600_series">What's new in the 600 Series</a></li>
	</ul>

</ul>
-->
<!-- INDEX END -->

<p>
</p>
<h1><a name="activeperl_5_6_change_log">ActivePerl 5.6 Change Log</a></h1>
<p>For the latest information on ActivePerl, please see:</p>
<pre>
    <a href="http://www.ActiveState.com/ActivePerl/">http://www.ActiveState.com/ActivePerl/</a></pre>
<p>
</p>
<h2><a name="build_638_thursday__apr_15__2004">Build 638 Thursday, Apr 15, 2004</a></h2>
<p><em>PPM2 and PPM3</em></p>
<p>PPM3 has <strong>not</strong> been updated to the latest version PPM 3.1 as shipped
with the ActivePerl 5.8 series.  PPM 3.1 assumes that PPM 2.x is no
longer installed and doesn't synchronize package information with it.
Since PPM2 is the default PPM version in ActivePerl 5.6, PPM3 has been
kept at version 3.0.</p>
<p><em>Bug Fixes and Changes</em></p>
<ul>
<li></li>
On Windows, a potential buffer overrun in the <code>stat()</code> function has been
fixed.
<p></p>
<li></li>
On Windows, a handle leak in <code>kill()</code> has been fixed.
<p></p>
<li></li>
On Windows, a memory leak in <code>fork()</code> has been fixed.
<p></p>
<li></li>
On Windows NT and later, subprocesses are now started via ``cmd /x/d/c''
instead of ``cmd /x/c''.  This disables execution of AutoRun command
specified in the registry.
<p></p>
<li></li>
On Windows, the four-argument form of <code>select()</code> did not report the
$! (errno) value properly after errors.  This has been corrected.
<p></p>
<li></li>
Win32::GetOSVersion() returns additional information about the system
(when available, Windows NT SP6 and later).
<p></p>
<li></li>
Perl for ISAPI would sometimes close a filehandle twice.  This leads
to a race condition where another thread could have reused the
filehandle before the second close would be executed.  This usually
happens in high load scenarios.  Typical symptoms include error
messages that Perl could not load standard modules, even though they
are installed on the server.
<p>Perl for ISAPI no longer closes filehandles implicitly and relies now
on the application to properly clean up file and socket handle
resources.</p>
<p></p>
<li></li>
Perl for ISAPI now avoids closing the special handles STDIN, STDOUT
and STDERR, even if the script asked for that explicitly.
<p></p>
<li></li>
The following bundled modules have been updated to their latest
versions:
<pre>
  Archive-Tar
  Compress-Zlib
  Digest
  Digest-MD2
  Digest-MD5
  Digest-SHA1
  File-CounterFile
  HTML-Parser
  HTML-Tree
  libnet
  libwin32
  libwww-perl
  MD5
  MIME-Base64
  Storable
  Test-Harness
  URI</pre>
<p>The following modules have been added to ActivePerl:</p>
<pre>
  Data-Dump
  IO-Zlib
  Test-Simple</pre>
<p></p>
<li></li>
Other minor bug fixes and documentation updates.
<p></p></ul>
<p>
</p>
<h2><a name="build_635_thursday__feb_6__2003">Build 635 Thursday, Feb 6, 2003</a></h2>
<p><em>Fixes for Security Issues</em></p>
<ul>
<li></li>
On Linux, the <code>crypt()</code> builtin did not return consistent results.
This has been corrected.
<p></p>

***** cut off here ******


Output:
---------------

** Itterations      = 3
** Debug            = 0
** Rmv white space  = 0
** ForceArray       = 0
** KeepRoot         = 1
** KeepComments     = 1
** KeepContentOrder = 1

$VAR1 = {
          'html' => {
                      'xmlns' => 'http://www.w3.org/1999/xhtml',
                      'content' => [
                                     {
                                       'head' => [
                                                   {
                                                     'title' => 'ActivePerl 5.6 Change Log'
                                                   },
                                                   {
                                                     'link' => {
                                                                 'rel' => 'stylesheet',
                                                                 'href' => 'Active.css',
                                                                 'type' => 'text/css'
                                                               }
                                                   },
                                                   {
                                                     'link' => {
                                                                 'href' => 'mailto:',
                                                                 'rev' => 'made'
                                                               }
                                                   }
                                                 ]
                                     },
                                     {
                                       'body' => [
                                                   {
                                                     'p' => {
                                                              'a' => {
                                                                       'name' => '__index__'
                                                                     }
                                                            }
                                                   },
                                                   {
                                                     'comment' => ' INDEX BEGIN '
                                                   },
                                                   {
                                                     'comment' => '

<ul>

	<li><a href="#activeperl_5_6_change_log">ActivePerl 5.6 Change Log</a></li>
	<ul>

		<li><a href="#build_638_thursday__apr_15__2004">Build 638 Thursday, Apr 15, 2004</a></li>
		<li><a href="#build_635_thursday__feb_6__2003">Build 635 Thursday, Feb 6, 2003</a></li>
		<li><a href="#build_633_monday__june_17__2002">Build 633 Monday, June 17, 2002</a></li>
		<li><a href="#build_632_monday__june_3__2002">Build 632 Monday, June 3, 2002</a></li>
		<li><a href="#build_631_monday__december_31__2001">Build 631 Monday, December 31, 2001</a></li>
		<li><a href="#build_630_wednesday__october_30__2001">Build 630 Wednesday, October 30, 2001</a></li>
		<li><a href="#build_629_thursday__august_23__2001">Build 629 Thursday, August 23, 2001</a></li>
		<li><a href="#build_628_thursday__july_5__2001">Build 628 Thursday, July 5, 2001</a></li>
		<li><a href="#build_626_thursday__may_1__2001">Build 626 Thursday, May 1, 2001</a></li>
		<li><a href="#build_623_sunday__december_12__2000">Build 623 Sunday, December 12, 2000</a></li>
		<li><a href="#build_622_sunday__november_5__2000">Build 622 Sunday, November 5, 2000</a></li>
		<li><a href="#build_620_sunday__october_29__2000">Build 620 Sunday, October 29, 2000</a></li>
		<li><a href="#build_618_tuesday__september_12__2000">Build 618 Tuesday, September 12, 2000</a></li>
		<li><a href="#build_617_thursday__august_31__2000">Build 617 Thursday, August 31, 2000</a></li>
		<li><a href="#build_616_friday__july_14__2000">Build 616 Friday, July 14, 2000</a></li>
		<li><a href="#build_615_thursday__june_29__2000">Build 615 Thursday, June 29, 2000</a></li>
		<li><a href="#build_613_thursday__march_23__2000">Build 613 Thursday, March 23, 2000</a></li>
		<li><a href="#build_612_wednesday__march_22__2000">Build 612 Wednesday, March 22, 2000</a></li>
		<li><a href="#build_611_wednesday__march_15__2000">Build 611 Wednesday, March 15, 2000</a></li>
		<li><a href="#build_609_wednesday__march_1__2000">Build 609 Wednesday, March 1, 2000</a></li>
		<li><a href="#build_607_friday__february_11__2000">Build 607 Friday, February 11, 2000</a></li>
		<li><a href="#build_606_friday__february_4__2000">Build 606 Friday, February 4, 2000</a></li>
		<li><a href="#build_604_friday__november_26__1999">Build 604 Friday, November 26, 1999</a></li>
		<li><a href="#build_603_tuesday__november_23__1999">Build 603 Tuesday, November 23, 1999</a></li>
		<li><a href="#build_602_thursday__august_5__1999">Build 602 Thursday, August 5, 1999</a></li>
		<li><a href="#build_601_tuesday__july_13__1999">Build 601 Tuesday, July 13, 1999</a></li>
		<li><a href="#what_s_new_in_the_600_series">What\'s new in the 600 Series</a></li>
	</ul>

</ul>
'
                                                   },
                                                   {
                                                     'comment' => ' INDEX END '
                                                   },
                                                   {
                                                     'p' => {}
                                                   },
                                                   {
                                                     'h1' => {
                                                               'a' => {
                                                                        'content' => 'ActivePerl 5.6 Change Log',
                                                                        'name' => 'activeperl_5_6_change_log'
                                                                      }
                                                             }
                                                   },
                                                   {
                                                     'p' => 'For the latest information on ActivePerl, please see:'
                                                   },
                                                   {
                                                     'pre' => {
                                                                'a' => {
                                                                         'href' => 'http://www.ActiveState.com/ActivePerl/',
                                                                         'content' => 'http://www.ActiveState.com/ActivePerl/'
                                                                       }
                                                              }
                                                   },
                                                   {
                                                     'p' => {}
                                                   },
                                                   {
                                                     'h2' => {
                                                               'a' => {
                                                                        'content' => 'Build 638 Thursday, Apr 15, 2004',
                                                                        'name' => 'build_638_thursday__apr_15__2004'
                                                                      }
                                                             }
                                                   },
                                                   {
                                                     'p' => {
                                                              'em' => 'PPM2 and PPM3'
                                                            }
                                                   },
                                                   {
                                                     'p' => [
                                                              'PPM3 has ',
                                                              {
                                                                'strong' => 'not'
                                                              },
                                                              ' been updated to the latest version PPM 3.1 as shipped
with the ActivePerl 5.8 series.  PPM 3.1 assumes that PPM 2.x is no
longer installed and doesn\'t synchronize package information with it.
Since PPM2 is the default PPM version in ActivePerl 5.6, PPM3 has been
kept at version 3.0.'
                                                            ]
                                                   },
                                                   {
                                                     'p' => {
                                                              'em' => 'Bug Fixes and Changes'
                                                            }
                                                   },
                                                   {
                                                     'ul' => [
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
On Windows, a potential buffer overrun in the ',
                                                               {
                                                                 'code' => 'stat()'
                                                               },
                                                               ' function has been
fixed.
',
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
On Windows, a handle leak in ',
                                                               {
                                                                 'code' => 'kill()'
                                                               },
                                                               ' has been fixed.
',
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
On Windows, a memory leak in ',
                                                               {
                                                                 'code' => 'fork()'
                                                               },
                                                               ' has been fixed.
',
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
On Windows NT and later, subprocesses are now started via ``cmd /x/d/c\'\'
instead of ``cmd /x/c\'\'.  This disables execution of AutoRun command
specified in the registry.
',
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
On Windows, the four-argument form of ',
                                                               {
                                                                 'code' => 'select()'
                                                               },
                                                               ' did not report the
$! (errno) value properly after errors.  This has been corrected.
',
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
Win32::GetOSVersion() returns additional information about the system
(when available, Windows NT SP6 and later).
',
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
Perl for ISAPI would sometimes close a filehandle twice.  This leads
to a race condition where another thread could have reused the
filehandle before the second close would be executed.  This usually
happens in high load scenarios.  Typical symptoms include error
messages that Perl could not load standard modules, even though they
are installed on the server.
',
                                                               {
                                                                 'p' => 'Perl for ISAPI no longer closes filehandles implicitly and relies now
on the application to properly clean up file and socket handle
resources.'
                                                               },
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
Perl for ISAPI now avoids closing the special handles STDIN, STDOUT
and STDERR, even if the script asked for that explicitly.
',
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
The following bundled modules have been updated to their latest
versions:
',
                                                               {
                                                                 'pre' => '
  Archive-Tar
  Compress-Zlib
  Digest
  Digest-MD2
  Digest-MD5
  Digest-SHA1
  File-CounterFile
  HTML-Parser
  HTML-Tree
  libnet
  libwin32
  libwww-perl
  MD5
  MIME-Base64
  Storable
  Test-Harness
  URI'
                                                               },
                                                               {
                                                                 'p' => 'The following modules have been added to ActivePerl:'
                                                               },
                                                               {
                                                                 'pre' => '
  Data-Dump
  IO-Zlib
  Test-Simple'
                                                               },
                                                               {
                                                                 'p' => ''
                                                               },
                                                               {
                                                                 'li' => ''
                                                               },
                                                               '
Other minor bug fixes and documentation updates.
',
                                                               {
                                                                 'p' => ''
                                                               }
                                                             ]
                                                   },

********** cut off here ************




------------------------------

Date: Sat, 31 Dec 2005 12:34:40 -0800
From: Henry Salvia <hjs@cadence.com>
Subject: Net::FTP can't locate object method "new"
Message-Id: <43B6EB60.CFA6D447@cadence.com>

I'm trying to install the libnet module to use Net::FTP and have run
into a
problem. I've checked out the bug report page for libnet and the only
answer the
author gave was that the install must not be complete. I did do 2
installs, the
1st used a "non-standard" location by running perl Makefile.PL
PREFIX=/mypath
the 2nd was standard. Both installs passed "make test", and both fail
the
same way, code and error message below (only the host/login/passwd names
were
changed to protect the guilty...). And ideas on how to troubleshoot
this?
Thanks

Henry Salvia
hjs@cadence.com

#!/usr/local/bin/perl
use Net::FTP ;
use strict ;

my $host = "hhh" ;
my $login = "lll" ;
my $passwd = 'ppp' ;
my $dir         = "/" ;

my $ftp = Net::FTP->new($host) or die "Can't: $@" ;

$ftp->login($login, $passwd) or die "Can't login: ", $ftp->message ;

$ftp->cwd($dir) ;

my $ls = $ftp->ls() ;

foreach my $f ( @$ls ) {
        print "\t($f)\n" ;
}

$ftp->quit ;
marvin.Cadence.COM(hjs)-/mnt4/hjs/CPAN/libnet-1.19 76 > ./spoo
Can't locate object method "new" via package "Net::FTP::A" at
/usr/local/perl5.0
04/lib/sun4-solaris/5.00401/IO/Socket.pm line 247.
marvin.Cadence.COM(hjs)-/mnt4/hjs/CPAN/libnet-1.19 77 >


------------------------------

Date: 31 Dec 2005 22:52:48 GMT
From: anno4000@lublin.zrz.tu-berlin.de (Anno Siegel)
Subject: Re: Net::FTP can't locate object method "new"
Message-Id: <dp7240$rbm$1@mamenchi.zrz.TU-Berlin.DE>

Henry Salvia  <hjs@cadence.com> wrote in comp.lang.perl.misc:
> I'm trying to install the libnet module to use Net::FTP and have run
> into a
> problem. I've checked out the bug report page for libnet and the only
> answer the
> author gave was that the install must not be complete. I did do 2
> installs, the
> 1st used a "non-standard" location by running perl Makefile.PL
> PREFIX=/mypath
> the 2nd was standard. Both installs passed "make test", and both fail
> the
> same way, code and error message below (only the host/login/passwd names
> were
> changed to protect the guilty...). And ideas on how to troubleshoot
> this?
> Thanks
> 
> Henry Salvia
> hjs@cadence.com
> 
> #!/usr/local/bin/perl
> use Net::FTP ;
> use strict ;
> 
> my $host = "hhh" ;
> my $login = "lll" ;
> my $passwd = 'ppp' ;
> my $dir         = "/" ;
> 
> my $ftp = Net::FTP->new($host) or die "Can't: $@" ;
> 
> $ftp->login($login, $passwd) or die "Can't login: ", $ftp->message ;
> 
> $ftp->cwd($dir) ;
> 
> my $ls = $ftp->ls() ;
> 
> foreach my $f ( @$ls ) {
>         print "\t($f)\n" ;
> }
> 
> $ftp->quit ;
> marvin.Cadence.COM(hjs)-/mnt4/hjs/CPAN/libnet-1.19 76 > ./spoo
> Can't locate object method "new" via package "Net::FTP::A" at
> /usr/local/perl5.0
> 04/lib/sun4-solaris/5.00401/IO/Socket.pm line 247.
> marvin.Cadence.COM(hjs)-/mnt4/hjs/CPAN/libnet-1.19 77 >

The path name along which your perl found IO::Socket contains a line
feed.  That is probably not intentional.  Also, perl 5.00401 is ancient.
Something is messed up with your installation.

It isn't clear what business IO::Socket has calling Net::FTP::A->new,
but in 5.00401 line 247 in IO/Socket.pm is

    my $new = $pkg->new(Timeout => $timeout);

so apparently it does.

Anno
-- 
If you want to post a followup via groups.google.com, don't use
the broken "Reply" link at the bottom of the article.  Click on 
"show options" at the top of the article, then click on the 
"Reply" at the bottom of the article headers.


------------------------------

Date: Sat, 31 Dec 2005 15:18:42 -0600
From: Tad McClellan <tadmc@augustmail.com>
Subject: Re: Ordering string of commands in a file
Message-Id: <slrndrdtdi.9tf.tadmc@magna.augustmail.com>

Raghuramaiah Gompa <rgompa@steel.ucs.indiana.edu> wrote:

[ snip 120 lines of quoted text! ]

> I tried 
> several ways and failed 


Show us your code, and we will help you fix it.


-- 
    Tad McClellan                          SGML consulting
    tadmc@augustmail.com                   Perl programming
    Fort Worth, Texas


------------------------------

Date: 6 Apr 2001 21:33:47 GMT (Last modified)
From: Perl-Users-Request@ruby.oce.orst.edu (Perl-Users-Digest Admin) 
Subject: Digest Administrivia (Last modified: 6 Apr 01)
Message-Id: <null>


Administrivia:

#The Perl-Users Digest is a retransmission of the USENET newsgroup
#comp.lang.perl.misc.  For subscription or unsubscription requests, send
#the single line:
#
#	subscribe perl-users
#or:
#	unsubscribe perl-users
#
#to almanac@ruby.oce.orst.edu.  

NOTE: due to the current flood of worm email banging on ruby, the smtp
server on ruby has been shut off until further notice. 

To submit articles to comp.lang.perl.announce, send your article to
clpa@perl.com.

#To request back copies (available for a week or so), send your request
#to almanac@ruby.oce.orst.edu with the command "send perl-users x.y",
#where x is the volume number and y is the issue number.

#For other requests pertaining to the digest, send mail to
#perl-users-request@ruby.oce.orst.edu. Do not waste your time or mine
#sending perl questions to the -request address, I don't have time to
#answer them even if I did know the answer.


------------------------------
End of Perl-Users Digest V10 Issue 8814
***************************************


home help back first fref pref prev next nref lref last post