2
votes

Problem

I'm writing a Julia script, and in the function there is a while loop. Inside the while loop there is a variable. That line is throwing errors about the variable being undefined when in fact that is the very line defining the variable.

The code

The error is on line 65

function cleanTexLoop(fileName::String)
    f = open(fileName, "r")
    while ! eof(f)
        line = readline(f), <-- line 65
        #line = sentenceFilter(line)
        println(line)
    end
    close(f)
end

The function opens a file which IS getting passed into a loop. The loop runs until the end of file. While looping the file is read line by line. Each time it is read the line is stored in variable line and the file advances. In the proper version, that one line (66) isn't commented out, however for debugging it is. line is then taken as input into a filter which modifies the line before storing it again as line. The final version of this script will have four filters, but for now, I'd be happy to get this to run with just zero filters.

(Note that a user has kindly pointed out the comma that after hours of looking at the code continued to allude me. I'm waiting for that user to write up an answer)

The error message

cleanTexLoop("test.tex")
ERROR: UndefVarError: line not defined Stacktrace:
[1] cleanTexLoop(::String) at /home/nero/myScripts/latexCleaner.jl:65
[2] macro expansion at ./REPL.jl:97 [inlined]
[3] (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at > ./event.jl:73

Previous working version

I had previous written another version of this which works in entirety, however I needed to make some substantial changes to its structure in order to better suit future plans. Note that some of the names aren't up to the normal naming convention. Namely, I use "!" when no variables are actually being changed.

function CleanTexLoop(fileName::String,regX::String,sub::String)
    f = open(fileName, "r")
    while ! eof(f)
        println(applySub!(f,regX,sub))
    end
    close(f)
end

function applySub!(file::IOStream,regX::String,sub::String)
    return replace(
        readline(file),
        Base.Regex(regX),
        Base.SubstitutionString(sub)
    )
end

A simple loop which demonstrates why this should work

x = 0
while x < 4
   y = x
   println(y)
   x = x+1
end

As expected, this prints zero to one, and is, as far as I can tell, representative of what I am doing. In both cases I am passing some variable into the loop which, through some action, defines another variable inside the loop which is then printed. Why this works, and the other doesn't is beyond me.

What I've seen on Google.

From looking this problem up, it appears as if this problem arrises when defining variables outside of a loop, or similar environment, as a result of them failing to be passed into the environment. However, this isn't what's happening in my case. In my case the variable is being defined for the first time.

1
What is with the trailing comma in the failing case? Does that make Julia treat it as a line-continues? ie. line = readline(f), print(line). - user2864740
@user2864740(\facepalm) The problem. Please feel free to write that up as the answer. - Nero gris
If you have two expressions in the same line then ; is a proper separator to use. See docs.julialang.org/en/latest/manual/control-flow/… explanation in the Julia manual of compound expressions. Using , creates a tuple. - Bogumił Kamiński
That comma was a typo. It wasn't meant to be here. I simply didn't notice it. - Nero gris
still weird though; that comma shouldn't result in line being undefined ... it should have just resulted in it being of a different type (i.e. a one-tuple). - Tasos Papastylianou

1 Answers

1
votes

As mentioned in the comments, the problem was an errant comma.