[pm-h] Fwd: Re: Par not working on Net::FTP::Recursive Script
Mike Flannigan
mikeflan at att.net
Sat Aug 8 06:49:47 PDT 2015
I'm just pass this along in case any of you
are interested in this. It has something to do
with PAR::_run_member using a filehandle opened in binmode.
binmode DATA, ':crlf';
would reportedly fix it, but I did
s/[\r\n]+$//;
in my code instead. That fixed it for me.
This is apparently a Windows issue that does not affect Linux,
I think.
-------- Forwarded Message --------
Subject: Re: Par not working on Net::FTP::Recursive Script
Date: Sat, 08 Aug 2015 07:12:27 -0500
From: Mike Flannigan <mikeflan at att.net>
To: par at perl.org
CC: shawn.laffan at unsw.edu.au
On 8/8/2015 1:36 AM, par-digest-help at perl.org wrote:
> This is a more general problem than PAR.
>
> I've had similar issues with input files when I was alternating
> between cygwin and normal windows in the distant past.
> Data::Section::Simple also does the same thing, in that it does not
> translate crlf endings when loading from a data block on linux. I
> expect there are many other ways of hitting this issue.
>
> The solution I use is to remove the crlf line endings in my code, e.g.:
>
> s/[\r\n]+$// for @data;
>
> or, more verbosely but more clearly:
>
> for my $item (@data) {
> $item =~ s/[\r\n]+$//;
> }
>
> Regards,
> Shawn.
Thanks for that fix. I was too lazy to carry this forward
until I saw your e-mail. Of course it worked. The script
works in both PAR and regular Perl when putting that regex
in there.
Thanks to everyone for all the help.
For my records I have summarized most of the e-mails on this
subject below.
Mike
------------------------------------------------------------------------
Subject:
Par not working on Net::FTP::Recursive Script
From:
Mike Flannigan <mikeflan at att.net>
Date:
8/2/2015 12:51 PM
To:
par at perl.org
I have a script that runs fine in Perl64, but when I do
pp -o uploadfiles.exe inputfile.pl
and try to run uploadfiles.exe it opens a prompt
box and tries to connect to a HostGator account,
but after a few seconds gives
"login authentication failed".
The script uses this:
use strict;
use warnings;
use File::Find;
use Net::FTP::Recursive;
$| = 1; #Autoflush STDOUT
Anybody have any ideas on why this is not working?
This is Activestate Perl 5.16.3 built for
MSWin32-x64.
Mike
------------------------------------------------------------------------
Subject:
Re: Par not working on Net::FTP::Recursive Script
From:
Roderich Schupp <roderich.schupp at gmail.com>
Date:
8/2/2015 2:03 PM
To:
Mike Flannigan <mikeflan at att.net>
CC:
"par at perl.org" <par at perl.org>
On Sun, Aug 2, 2015 at 7:51 PM, Mike Flannigan <mikeflan at att.net
<mailto:mikeflan at att.net>> wrote:
The script uses this:
Not enough information. For instance, how does it "open a prompt box"?
Try cutting the script down to a minimal example that exhibits the problem.
Cheers, Roderich
------------------------------------------------------------------------
Subject:
Re: Par not working on Net::FTP::Recursive Script
From:
Mike Flannigan <mikeflan at att.net>
Date:
8/2/2015 6:09 PM
To:
Roderich Schupp <roderich.schupp at gmail.com>
CC:
"par at perl.org" <par at perl.org>
In Windows when you double click on a par exe file it opens
a command prompt box to show the results of the script.
I guess a minimalist script would be as follow:
use strict;
use warnings;
use Net::FTP::Recursive;
my $ip="142.146.2.103";
my $username="user";
my $pass="pass";
my $ftp = Net::FTP::Recursive->new($ip, Passive => 1, Debug => 0);
$ftp->login($username, $pass) or die $ftp->message;
print "All done.\n\a";
__END__
Interestingly, this seems to work in the par exe created
from this file.
OK, I haven't figured it out 100% yet, but it appears to have
something to do with the newline at the end of each of these
lines:
__DATA__
BkmTNBOhAQjsn3YUJWA9cw2JDp8lcw
Jx7ecihoLGsWidVUgRDl5CI38mpLbF
23X7p1HDSwXgGg4z8xSNshVBQScLCB
MkNyVS4Dnkx55TsW1VfCVm7niOU777
In my Windows Perl environment when I count
22 characters forward, I get the character I expect
to get. In the par environment, when I count
22 characters forward I get the character at position 21
instead (if it goes past the end of one of the lines). Perhaps
this has something to do with a newline being interpreted as
\n\r or \n or \cJ or whatever.
I'm probably going to have an ugly work-around for this. Or
perhaps I can come up with a more elegant work-around when
using par. We will see.
Thanks for your help.
Mike
------------------------------------------------------------------------
Subject:
Re: Par not working on Net::FTP::Recursive Script
From:
Roderich Schupp <roderich.schupp at gmail.com>
Date:
8/3/2015 9:44 AM
To:
Mike Flannigan <mikeflan at att.net>
CC:
"par at perl.org" <par at perl.org>
On Mon, Aug 3, 2015 at 1:09 AM, Mike Flannigan <mikeflan at att.net
<mailto:mikeflan at att.net>> wrote:
OK, I haven't figured it out 100% yet, but it appears to have
something to do with the newline at the end of each of these
lines:
__DATA__
BkmTNBOhAQjsn3YUJWA9cw2JDp8lcw
Good observation! I packed the following script (and checked that it has
Windows CRLF line endings)
--- snip ---
use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Useqq = 1;
my @data = <DATA>;
print Dumper(\@data);
__DATA__
fooy
bar
quux
--- snip ---
$ perl data.pl <http://data.pl>
$VAR1 = [
"foo\n",
"bar\n",
"quux\n"
];
but when I pack it
$ pp -o data.exe data.pl <http://data.pl>
$ .\data.exe
$VAR1 = [
"foo\r\n",
"bar\r\n",
"quux\r\n"
];
I checked the script as packed into data.exe and it has its CRLF endings
intact.
But the hack that's used to actually run it (i.e. PAR::_run_member) uses
a filehandle opened in binmode.
Looks like the implicit DATA filehandle inherits this setting somehow.
I'll have to think some more whether changing PAR::_run_member might
have side effects.
Cheers, Roderich
------------------------------------------------------------------------
Subject:
Re: Par not working on Net::FTP::Recursive Script
From:
Mike Flannigan <mikeflan at att.net>
Date:
8/3/2015 5:33 PM
To:
Roderich Schupp <roderich.schupp at gmail.com>
CC:
"par at perl.org" <par at perl.org>
Thanks for confirming that. Chomp certainly doesn't fix
the problem. Oddly I couldn't get the variable I wanted
no matter what I did! I always got the variable in front of
or behind the one I wanted, even though I only moved the
array index by one.
I finally gave up and removed all the newlines. I just
put all the data on one line now.
It's a bit frustrating, but I have my fix.
I'm surprised I was the one to point this out.
Must be very few of us Windows par users.
Mike
------------------------------------------------------------------------
Subject:
Re: Par not working on Net::FTP::Recursive Script
From:
Roderich Schupp <roderich.schupp at gmail.com>
Date:
8/4/2015 9:03 AM
To:
Mike Flannigan <mikeflan at att.net>
CC:
"par at perl.org" <par at perl.org>
On Tue, Aug 4, 2015 at 12:33 AM, Mike Flannigan <mikeflan at att.net
<mailto:mikeflan at att.net>> wrote:
Thanks for confirming that. Chomp certainly doesn't fix
the problem.
chomp won't help, in my example it will only get you from
$VAR1 = [
"foo\r\n",
"bar\r\n",
"quux\r\n"
];
to
$VAR1 = [
"foo\r",
"bar\r",
"quux\r"
];
By default, chomp doesn't strip CR LF, as $/ is "\n" even on Windows.
Reading a file on Windows in non-binmode will convert CR LF to "\n".
My guess would be that the majority of PAR users is on Windows, but
using __DATA__ is rare.
Or at least using the data in a way that is susceptible to CRLF v LF
corruption.
Cheers, Roderich
------------------------------------------------------------------------
Subject:
Re: Par not working on Net::FTP::Recursive Script
From:
Shawn Laffan <shawn.laffan at unsw.edu.au>
Date:
8/3/2015 6:44 PM
To:
<par at perl.org>
On 4/08/2015 8:33, Mike Flannigan wrote:
This is a more general problem than PAR.
I've had similar issues with input files when I was alternating between
cygwin and normal windows in the distant past. Data::Section::Simple
also does the same thing, in that it does not translate crlf endings
when loading from a data block on linux. I expect there are many other
ways of hitting this issue.
The solution I use is to remove the crlf line endings in my code, e.g.:
s/[\r\n]+$// for @data;
or, more verbosely but more clearly:
for my $item (@data) {
$item =~ s/[\r\n]+$//;
}
Regards,
Shawn.
------------------------------------------------------------------------
No worries Mike.
After a bit more thought, the whole process might be simplified by
adding the :crlf layer to the DATA handle in your code. This is set by
default on windows, but not on linux.
e.g.:
binmode DATA, ':crlf';
while (my $line = <DATA>) {
do_stuff($line);
}
A few more details are at http://perldoc.perl.org/PerlIO.html#DESCRIPTION
Regards,
Shawn.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/houston/attachments/20150808/55e294f3/attachment-0001.html>
More information about the Houston
mailing list