1. stumped by match()
- Posted by Jim <futures8 at PCOLA.GULF.NET>
Sep 02, 2000
-
Last edited Sep 03, 2000
Been studying Euphoria for a few weeks, trying out each statement, until I felt
I fully understood how it worked. But I
have now met my match(). Completely stumped. The following program demonstrates
my bewilderment. Match() seems to work
as expected (re; the docs and sample program gets.ex provided with Euphoria), as
long as the sequence to be matched
against is read in from a file; does not work as expected if s2 is hard-coded in
the prog.
Clearly, I have a problem in understanding how match() is to be used, as the
following program demonstrates.
-----------------------------------------------------------------------------------
include get.e
include file.e
include wildcard.e
allow_break(1)
with trace
sequence seq
integer char,FoundSpaceAt,FoundTextAt, true, false,i,e,finally,fn
atom adam
object string1,string2,string3,string4,string5,string6,string7,line,TextFile,
line2,TestString
true = 1
false = 0
string1 = {" "}
string2 = {"OF-LIN"}
string3 = ","
string4 = "END-OF"
string5 = {32}
string6 = {32,32}
string7 = {34,36}
finally = false
line = {"ABCDE.TXT"," 123.456"," 345.567"," 44444.555","
END-OF-LINE","Euphoria"}
trace(1)
FoundSpaceAt = match(string1,line) -- doesn't work, returns 0
FoundTextAt = match(string2,line) -- doesn't work, returns 0
FoundTextAt = match(string3,line) -- doesn't work, returns 0
FoundSpaceAt = match(string4,line) -- doesn't work, returns 0
FoundTextAt = match(string5,line) -- doesn't work, returns 0
FoundSpaceAt = match(string6,line) -- doesn't work, returns 0
FoundTextAt = match(string7,line) -- doesn't work, returns 0
if match("Euphoria", line) then
FoundTextAt = match("Euphoria", line) -- doesn't work, returns 0
end if
i = match("Euphoria",line) -- nope, returns 0
--------------------------------
-- try reading it from a file
--------------------------------
fn = open("test.prt","rb")
if fn = -1 then
puts(1,"Open failed")
end if
TextFile = fn
line2 = gets(TextFile) -- identical data to
'line', above
if atom(line2) then
close(TextFile)
end if
if match("Euphoria", line2) then -- read from file - works, Why?
finally = true
end if
if match(" ", line2) then
FoundSpaceAt = match(" ", line2) -- read from file - works, Why?
end if
TestString = "Euphoria"
if match(TestString, line2) then
FoundTextAt = match(TestString, line2) -- read from file - works, Why?
end if
abort(1)
------------------------------------------------------------------------------------------------------------
Appreciate any and all offers of help.
Thanks,
Dumbfounded (maybe just dumb??)
Jim
2. Re: stumped by match()
Ray,
Thanks. Looks like you nailed it. Your e-mail pointed back to the docs, and the
description of gets(). The very first
line reads ...
"Get the next sequence..." (duuuuhhh!)
Completely explains the results of the program.
Thanks for the help.
Regards,
Jim
Ray & Debbie Smith wrote:
> Hi Jim,
>
> Not being an expert I'll try my best ...
>
> ...from the doco
>
> Syntax: i = match(s1, s2)
>
> Description: Try to match s1 against some slice of s2. If successful,
> return
> the element number of s2 where the (first) matching slice
> begins,
> else return 0.
>
> Your sequence of "line"
>
> line = {"ABCDE.TXT"," 123.456"," 345.567"," 44444.555","
> END-OF-LINE","Euphoria"}
>
> is a sequence of sequences, after reading the doco I "think" you can only
> match a single
> sequence s1 against a single sequence s2.
>
> When reading from a file using "gets" it reads one line of a file into a
> single sequence so your "line" above would be a single
> sequence so the match should be able to match the slice.
>
> Hope this helps
>
> Ray Smith
>
> > --------------------------------------------------------------------------
> ---------
> > include get.e
> > include file.e
> > include wildcard.e
> >
> > allow_break(1)
> > with trace
> >
> > sequence seq
> > integer char,FoundSpaceAt,FoundTextAt, true, false,i,e,finally,fn
> > atom adam
> > object
> string1,string2,string3,string4,string5,string6,string7,line,TextFile,
> > line2,TestString
> >
> > true = 1
> > false = 0
> > string1 = {" "}
> > string2 = {"OF-LIN"}
> > string3 = ","
> > string4 = "END-OF"
> > string5 = {32}
> > string6 = {32,32}
> > string7 = {34,36}
> > finally = false
> >
> >
> > line = {"ABCDE.TXT"," 123.456"," 345.567"," 44444.555","
> END-OF-LINE","Euphoria"}
> >
> > trace(1)
> >
> > FoundSpaceAt = match(string1,line) -- doesn't work,
> returns 0
> > FoundTextAt = match(string2,line) -- doesn't work,
> returns 0
> > FoundTextAt = match(string3,line) -- doesn't work,
> returns 0
> > FoundSpaceAt = match(string4,line) -- doesn't work,
> returns 0
> > FoundTextAt = match(string5,line) -- doesn't work,
> returns 0
> >
> > FoundSpaceAt = match(string6,line) -- doesn't work,
> returns 0
> > FoundTextAt = match(string7,line) -- doesn't work,
> returns 0
> >
> > if match("Euphoria", line) then
> > FoundTextAt = match("Euphoria", line) -- doesn't work,
> returns 0
> > end if
> >
> > i = match("Euphoria",line) -- nope,
> returns 0
> >
> > --------------------------------
> > -- try reading it from a file
> > --------------------------------
> >
> > fn = open("test.prt","rb")
> > if fn = -1 then
> > puts(1,"Open failed")
> > end if
> > TextFile = fn
> >
> > line2 = gets(TextFile) -- identical
> data to 'line', above
> >
> > if atom(line2) then
> > close(TextFile)
> > end if
> >
> > if match("Euphoria", line2) then -- read from file - works,
> Why?
> > finally = true
> > end if
> >
> > if match(" ", line2) then
> > FoundSpaceAt = match(" ", line2) -- read from file - works,
> Why?
> > end if
> >
> > TestString = "Euphoria"
> > if match(TestString, line2) then
> > FoundTextAt = match(TestString, line2) -- read from file - works,
> Why?
> > end if
> >
> > abort(1)
> > --------------------------------------------------------------------------
> ----------------------------------
> >
> > Appreciate any and all offers of help.
> >
> > Thanks,
> >
> > Dumbfounded (maybe just dumb??)
> >
> > Jim
3. Re: stumped by match()
Hi Jim,
Not being an expert I'll try my best ...
...from the doco
Syntax: i = match(s1, s2)
Description: Try to match s1 against some slice of s2. If successful,
return
the element number of s2 where the (first) matching slice
begins,
else return 0.
Your sequence of "line"
line = {"ABCDE.TXT"," 123.456"," 345.567"," 44444.555","
END-OF-LINE","Euphoria"}
is a sequence of sequences, after reading the doco I "think" you can only
match a single
sequence s1 against a single sequence s2.
When reading from a file using "gets" it reads one line of a file into a
single sequence so your "line" above would be a single
sequence so the match should be able to match the slice.
Hope this helps
Ray Smith
> --------------------------------------------------------------------------
---------
> include get.e
> include file.e
> include wildcard.e
>
> allow_break(1)
> with trace
>
> sequence seq
> integer char,FoundSpaceAt,FoundTextAt, true, false,i,e,finally,fn
> atom adam
> object
> line2,TestString
>
> true = 1
> false = 0
> string1 = {" "}
> string2 = {"OF-LIN"}
> string3 = ","
> string4 = "END-OF"
> string5 = {32}
> string6 = {32,32}
> string7 = {34,36}
> finally = false
>
>
> line = {"ABCDE.TXT"," 123.456"," 345.567"," 44444.555","
END-OF-LINE","Euphoria"}
>
> trace(1)
>
> FoundSpaceAt = match(string1,line) -- doesn't work,
returns 0
> FoundTextAt = match(string2,line) -- doesn't work,
returns 0
> FoundTextAt = match(string3,line) -- doesn't work,
returns 0
> FoundSpaceAt = match(string4,line) -- doesn't work,
returns 0
> FoundTextAt = match(string5,line) -- doesn't work,
returns 0
>
> FoundSpaceAt = match(string6,line) -- doesn't work,
returns 0
> FoundTextAt = match(string7,line) -- doesn't work,
returns 0
>
> if match("Euphoria", line) then
> FoundTextAt = match("Euphoria", line) -- doesn't work,
returns 0
> end if
>
> i = match("Euphoria",line) -- nope,
returns 0
>
> --------------------------------
> -- try reading it from a file
> --------------------------------
>
> fn = open("test.prt","rb")
> if fn = -1 then
> puts(1,"Open failed")
> end if
> TextFile = fn
>
> line2 = gets(TextFile) -- identical
data to 'line', above
>
> if atom(line2) then
> close(TextFile)
> end if
>
> if match("Euphoria", line2) then -- read from file - works,
Why?
> finally = true
> end if
>
> if match(" ", line2) then
> FoundSpaceAt = match(" ", line2) -- read from file - works,
Why?
> end if
>
> TestString = "Euphoria"
> if match(TestString, line2) then
> FoundTextAt = match(TestString, line2) -- read from file - works,
Why?
> end if
>
> abort(1)
> --------------------------------------------------------------------------
----------------------------------
>
> Appreciate any and all offers of help.
>
> Thanks,
>
> Dumbfounded (maybe just dumb??)
>
> Jim