I made a couple more fixes to my box scores script to make it a bit groovier. First is a trivial one, but it’s much more in the Groovy idiom than in Java.
I replaced
def cal = Calendar.getInstance()
with
def cal = Calendar.instance
Groovy automatically uses the getter if you access a property of a class, as long as the property itself is private. Properties in Groovy are private by default, too, which is much more intuitive than Java’s “package-private” access. Of course, methods are public by default.
The other modification I made had to do with the fact that I was concerned about reading the remote XML file line by line. I thought it might be more appropriate to read the entire file into a local variable and then parse the file.
To do that, I found that the URL class had a getText()
method (or, more in the Groovy spirit, a text
property). That meant I could read the entire page by writing
def gamePage = new URL(url).text
Now the matching can be done all at once via
def m = gamePage =~ pattern
which results in a collection of matches. The only complication is that the pattern I’m searching for (/${day}_(\w*)mlb_(\w*)mlb_(\d) /
) appears twice in each line, once as the text value of the <a> tag and once as it’s href
attribute. I figured the easiest way to deal with that was to use eachWithIndex
and only worry about the even-numbered matches:
def m = gamePage =~ pattern if (m) { (0..<m.count).eachWithIndex { line, i -> if (i % 2) { away = m[line][1] home = m[line][2] num = m[line][3]
etc. The rest is essentially the same.
A good source for figuring out the Groovy way to do things is the PLEAC Groovy page. It rocks.