Hacking a script (makemenu.pl)

F

Frank Louden

Hi. Infrequent hacker here.

(Originally posted to alt.comp.lang.perl. Not much happening over there!)
(OK, then to comp.lang.perl where a kind soul redirected me.)

I've spent the last two days trying to hack H. Churchyard's makemenu.pl so
it will work on my WinME PC. I've got lots of hair but I won't have for
long.

If there is anyone out there that knows this script, I think I might learn
quite a bit by hacking my way thru this one but I could sure use some help.

I'm not looking for a working script or someone to do it for me. I'd just
like to understand what's going on here and why I am having such a tough
time getting very far with this. I'm using Activestate's perl, v5.8.6 built
for MSWin32-x86-multi-thread.

There are two "eval" lines here...

eval "exec /usr/local/bin/perl -S $0 $*" if $running_under_some_shell;

and...

eval '$'.$1.'$2;' while $ARGV[0] =~ /^(title=|toc=|dirprefix=)(.*)/ &&
shift;

The first is unnecessary (I think) and the second is extracting info from
the command line.

I don't know how advanced this script might be but it seems to be using
lot's of tricks that aren't taught in "Learning Perl on Win32 Systems". ;^)

Anyway, if there is someone that can spare the time to share some of their
knowledge with me, I'd be grateful.

I would attempt to contact the author of this script if I knew how. I've
used it "as is" on Linux and it works quite well for what I am wanting to
do.

Here's the error I get...

F:\Programming\Perl\HTML Menu Project>perl -d test2.pl title="My Menu" toc=1
*.htm > My_Menu.htm
Win32::OLE operating in debugging mode: _Unique => 1
Can't open *.htm: No such file or directory at test2.pl line 12.

And I have several small HTML files with the ".htm" extension in this
directory.

I've stripped this script down to what I think is the barest essentials for
testing. I don't expect this fragment to do anything I'm just trying to get
over a hump. I hit the "while (<>)" line and I get nothing. Here's what I
have at this time...

$title = ''; $toc = 0; $dirprefix = '';
eval '$'.$1.'$2;' while $ARGV[0] =~ /^(title=|toc=|dirprefix=)(.*)/ &&
shift;
$[ = 1; # set array base to 1
$\ = "\n"; # set output record separator
foreach $X (@ARGV) {
if ($X =~ /^[^=]+=/) {
print STDERR "Apparent misspelled or badly-placed command-line
option $\
&";
print STDERR "Attempting to continue anyway...";}}
$accum = ''; $haccum = '';
$xRS = $/;
#
while (<>) {
if ($_ =~ /$xRS$/o) {chop;} # strip record separator
if (($.-$FNRbase) == 1) {
if ($. == 1) {
if (!$title) {
$title = 'Menu for HTML files';}
print "<html><head><title>$title</title></head>";
print "<body><h1>$title</h1><hr><ul>";}
else {
if ($toc) {
&liout();}}
$hlevel = 0;}

};

Thanks in advance.

Raffles
 
W

Willie Wilson

Frank said:
...
F:\Programming\Perl\HTML Menu Project>perl -d test2.pl title="My Menu" toc=1
*.htm > My_Menu.htm
Win32::OLE operating in debugging mode: _Unique => 1
Can't open *.htm: No such file or directory at test2.pl line 12.
...

Maybe someone will correct me if I am wrong, but it appears that the DOS
prompt does not suppliment the asterisks for you like UNIX shells do; if
you 'echo *', you will just see '*', not all the files in the directory
like you would on a UNIX shell. You'll have to do the supplimentation
manually, perhaps by using glob().

Again, I could be wrong, but this seems to be the case here.

-Willie
 
J

James E Keenan

Frank said:
Hi. Infrequent hacker here.

(Originally posted to alt.comp.lang.perl. Not much happening over there!)
(OK, then to comp.lang.perl where a kind soul redirected me.)

I've spent the last two days trying to hack H. Churchyard's makemenu.pl so
it will work on my WinME PC. I've got lots of hair but I won't have for
long.

You didn't provide a link so I had to google. When I did so, the pages
I came up with were discussing "htmlchek version 4.0, January 17 1995".
And this was documentation -- not the code itself.

While I suspect there are probably readers of this list who are familiar
with this script, I frankly suspect that better tools have been
developed in the last ten-and-a-half years. What task are you trying to
accomplish?

Jim Keenan
 
F

Frank Louden

Thanks Willie and Jim. This version of perl allows globbing so I expected it
to work just fine with the <> operator. But, there are so many differences
between MSWindoze and Unix/Linux systems I thought the developers of this
distribution of perl would accomodate Win32's crippled OS.
 
J

John W. Krahn

Frank said:
Hi. Infrequent hacker here.

(Originally posted to alt.comp.lang.perl. Not much happening over there!)
(OK, then to comp.lang.perl where a kind soul redirected me.)

I've spent the last two days trying to hack H. Churchyard's makemenu.pl so
it will work on my WinME PC. I've got lots of hair but I won't have for
long.

If there is anyone out there that knows this script, I think I might learn
quite a bit by hacking my way thru this one but I could sure use some help.

I'm not looking for a working script or someone to do it for me. I'd just
like to understand what's going on here and why I am having such a tough
time getting very far with this. I'm using Activestate's perl, v5.8.6 built
for MSWin32-x86-multi-thread.

It looks like makemenu.pl was created using the a2p program (Awk to Perl
translator) on makemenu.awk.

perldoc a2p


If you have a more recent version of a2p it should produce a more up-to-date
perl program.

There are two "eval" lines here...

eval "exec /usr/local/bin/perl -S $0 $*" if $running_under_some_shell;

This is superfluous in a perl program if the first line
(#!/usr/local/bin/perl) is the correct location of perl.

and...

eval '$'.$1.'$2;' while $ARGV[0] =~ /^(title=|toc=|dirprefix=)(.*)/ &&
shift;

It appears that this is just sort-of imitating the perl '-s' command line switch.

The first is unnecessary (I think) and the second is extracting info from
the command line.

I don't know how advanced this script might be but it seems to be using
lot's of tricks that aren't taught in "Learning Perl on Win32 Systems". ;^)

Anyway, if there is someone that can spare the time to share some of their
knowledge with me, I'd be grateful.

I would attempt to contact the author of this script if I knew how. I've
used it "as is" on Linux and it works quite well for what I am wanting to
do.

Here's the error I get...

F:\Programming\Perl\HTML Menu Project>perl -d test2.pl title="My Menu" toc=1
*.htm > My_Menu.htm
Win32::OLE operating in debugging mode: _Unique => 1
Can't open *.htm: No such file or directory at test2.pl line 12.

DOS/Windows command processor (command.com/cmd.exe) does not expand wildcard
characters (like * or ?) so your perl program is trying to process the literal
file name '*.htm'.

perldoc -f glob
perldoc File::Glob




John
 
F

Frank Louden

Thank you John.

Actually I did get the program to work late last night but I have to load
@ARGV inside of the script. This is fine as my use for the script is to
build a menu of all of the HTML files inside of a directory and setting ARGV
to "*.htm*" in the script just means that I loose some of the options since
I can't get my info from the command line. That's all right for now. I am
sure you're right about this difficulty being OS related. Unfortunately, a
lot of us have to work on MS systems.

Thanks to all for your suggestions and help.

John W. Krahn said:
Frank said:
Hi. Infrequent hacker here.

(Originally posted to alt.comp.lang.perl. Not much happening over there!)
(OK, then to comp.lang.perl where a kind soul redirected me.)

I've spent the last two days trying to hack H. Churchyard's makemenu.pl so
it will work on my WinME PC. I've got lots of hair but I won't have for
long.

If there is anyone out there that knows this script, I think I might learn
quite a bit by hacking my way thru this one but I could sure use some help.

I'm not looking for a working script or someone to do it for me. I'd just
like to understand what's going on here and why I am having such a tough
time getting very far with this. I'm using Activestate's perl, v5.8.6 built
for MSWin32-x86-multi-thread.

It looks like makemenu.pl was created using the a2p program (Awk to Perl
translator) on makemenu.awk.

perldoc a2p


If you have a more recent version of a2p it should produce a more up-to-date
perl program.

There are two "eval" lines here...

eval "exec /usr/local/bin/perl -S $0 $*" if $running_under_some_shell;

This is superfluous in a perl program if the first line
(#!/usr/local/bin/perl) is the correct location of perl.

and...

eval '$'.$1.'$2;' while $ARGV[0] =~ /^(title=|toc=|dirprefix=)(.*)/ &&
shift;

It appears that this is just sort-of imitating the perl '-s' command line switch.
The first is unnecessary (I think) and the second is extracting info from
the command line.

I don't know how advanced this script might be but it seems to be using
lot's of tricks that aren't taught in "Learning Perl on Win32 Systems". ;^)

Anyway, if there is someone that can spare the time to share some of their
knowledge with me, I'd be grateful.

I would attempt to contact the author of this script if I knew how. I've
used it "as is" on Linux and it works quite well for what I am wanting to
do.

Here's the error I get...

F:\Programming\Perl\HTML Menu Project>perl -d test2.pl title="My Menu" toc=1
*.htm > My_Menu.htm
Win32::OLE operating in debugging mode: _Unique => 1
Can't open *.htm: No such file or directory at test2.pl line 12.

DOS/Windows command processor (command.com/cmd.exe) does not expand wildcard
characters (like * or ?) so your perl program is trying to process the literal
file name '*.htm'.

perldoc -f glob
perldoc File::Glob




John
 
F

Frank Louden

For anyone interested, the scripts for this program are available at...

http://www.crossmyt.com/hc/htmlchek/htmlchek.html

....near the bottom of the page.

It's old software. But for me, I expect a good lesson in regular expressions
and some other stuff.

Thanks again y'all!



Frank Louden said:
Hi. Infrequent hacker here.

(Originally posted to alt.comp.lang.perl. Not much happening over there!)
(OK, then to comp.lang.perl where a kind soul redirected me.)

I've spent the last two days trying to hack H. Churchyard's makemenu.pl so
it will work on my WinME PC. I've got lots of hair but I won't have for
long.

If there is anyone out there that knows this script, I think I might learn
quite a bit by hacking my way thru this one but I could sure use some help.

I'm not looking for a working script or someone to do it for me. I'd just
like to understand what's going on here and why I am having such a tough
time getting very far with this. I'm using Activestate's perl, v5.8.6 built
for MSWin32-x86-multi-thread.

There are two "eval" lines here...

eval "exec /usr/local/bin/perl -S $0 $*" if $running_under_some_shell;

and...

eval '$'.$1.'$2;' while $ARGV[0] =~ /^(title=|toc=|dirprefix=)(.*)/ &&
shift;

The first is unnecessary (I think) and the second is extracting info from
the command line.

I don't know how advanced this script might be but it seems to be using
lot's of tricks that aren't taught in "Learning Perl on Win32 Systems". ;^)

Anyway, if there is someone that can spare the time to share some of their
knowledge with me, I'd be grateful.

I would attempt to contact the author of this script if I knew how. I've
used it "as is" on Linux and it works quite well for what I am wanting to
do.

Here's the error I get...

F:\Programming\Perl\HTML Menu Project>perl -d test2.pl title="My Menu" toc=1
*.htm > My_Menu.htm
Win32::OLE operating in debugging mode: _Unique => 1
Can't open *.htm: No such file or directory at test2.pl line 12.

And I have several small HTML files with the ".htm" extension in this
directory.

I've stripped this script down to what I think is the barest essentials for
testing. I don't expect this fragment to do anything I'm just trying to get
over a hump. I hit the "while (<>)" line and I get nothing. Here's what I
have at this time...

$title = ''; $toc = 0; $dirprefix = '';
eval '$'.$1.'$2;' while $ARGV[0] =~ /^(title=|toc=|dirprefix=)(.*)/ &&
shift;
$[ = 1; # set array base to 1
$\ = "\n"; # set output record separator
foreach $X (@ARGV) {
if ($X =~ /^[^=]+=/) {
print STDERR "Apparent misspelled or badly-placed command-line
option $\
&";
print STDERR "Attempting to continue anyway...";}}
$accum = ''; $haccum = '';
$xRS = $/;
#
while (<>) {
if ($_ =~ /$xRS$/o) {chop;} # strip record separator
if (($.-$FNRbase) == 1) {
if ($. == 1) {
if (!$title) {
$title = 'Menu for HTML files';}
print "<html><head><title>$title</title></head>";
print "<body><h1>$title</h1><hr><ul>";}
else {
if ($toc) {
&liout();}}
$hlevel = 0;}

};

Thanks in advance.

Raffles
 
J

Joe Smith

Frank said:
Thanks Willie and Jim. This version of perl allows globbing so I expected it
to work just fine with the <> operator. But, there are so many differences
between MSWindoze and Unix/Linux systems I thought the developers of this
distribution of perl would accomodate Win32's crippled OS.

Which perl are you using?


C:\Documents and Settings\jms>dir/w *.pl
bcm-route.pl editorlog.pl ls-temp.pl prog1.pl temp.pl

C:\Documents and Settings\jms>perl -le "print qq{@ARGV}" *.pl
*.pl

C:\Documents and Settings\jms>perl -v
This is perl, v5.8.7 built for MSWin32-x86-multi-thread
Binary build 813 [148120] provided by ActiveState

That version of perl works just fine with the <> operator.
It's @ARGV that is different.
-Joe
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,007
Latest member
obedient dusk

Latest Threads

Top