I'd do this:
Path A: The Semi-Typical Method
Learn a language with a more regularized syntax like Java, C#, or Python. Perl is an insanely useful tool but it's also very very freeform in terms of how it lets you do things. The other languages I listed are much, much less so.
Get a book about Data Structures in said language.
Get a book on Algorithms in said language.
Get Code Complete and Effective Java/C#/Whatever Python's version is.
Path B: Joel Spolsky's Path of Enlightenment(or Death, take your pick)
Get the book "Code"
Get K&R's "The C Programming Language"
Get the Structure and Interpretation of Computer Programming
As far as the method's go, method 1 will teach you programming in a more regularized way. Computer Science concepts to an extent (no complexity theory yet, trust me) and provide you with a language that's better for working in projects with other people and for making bigger applications.
Method 2 is more hardcore, it's much more of a fundamentals approach with "Code" explaining the basics, K&R introducing the machine level stuff and the SICP introducing the higher level concepts. It's a much harder but more focused path.
In either case, give yourself time. Rome wasn't built in a day and neither are programming skills, even if you are a genius at it. Peter Norvig's Programming in 10 years is the usual essay I point people to.
As far as available free stuff: Python the Hard Way as listed below is a good start, from there, How to think like a Computer Scientist is a reasonable continuation.
There are a number of resources on Algorithms out there and honestly you probably could switch steps 3 and 4 without issue. Keep in mind, this is where the math really starts to show up so never be afraid to ask for help when you get to this stage. This seems to be a reasonable free guide.
There really isn't a cohesive free equivalent to Code Complete per say though Code like a Pythonista seems pretty solid. The big thing is to concentrate on making your code readable once you've got the fundamentals down pat. It's not "necessary" in the same way that having all your code syntax correct is but it makes live a lot easier once you get beyond small programs or work on something over a long period.
You might find that I've focused mostly on Python, that's because it is the easiest of the three to find well written free stuff. I think Java's tutorials by Oracle are fine but they are a little dry and not great for beginners. C# is in a similar situation though neither suffers from lack of documentation.
Also, your first CS joke/pun: you want to "Refactor" your education, not Backtrack.