Re: Perl Pro but Java Newbie: Need nudge in proper direction for
my favorite Perl routine in Java
You can do this in Java:
puts( "A single string test." );
puts( myStringArray );
puts( new String[] {
"This is line 1",
"This is line 2",
"This is line 3"
});
puts(exec("cmd /c dir"));
/usr/ceo wrote:
Okay, unforeseen circumstances have necessitated that I learn Java.
I'll refrain from providing my opinion of Java and extremely high
overhead compared to Perl, but... whatever.
You failed to refrain!
Okay, well, the #1 thing almost every developer needs to do is produce
output, and my favorite routine in Perl for doing this is:
sub puts { for (@_) { print "$_\n" } } # Modeled after Ruby's puts()
routine (mostly).
In Perl, that means I can:
puts( "This is a single line" );
and it will print that line with a newline automatically appended to
the end. But even better, I can:
puts(
"This is line 1",
"This is line 2",
"This is line 3",
"You get the picture..."
);
And all those lines are printed with no adjustments needed to the
puts() routine in Perl. It also allows me to do things like:
puts( shell( "ls -l /tmp" ) ); # Which isn't the best way of doing
things, but for example...
where shell() is some routine that exec()'s a system command produces
lines of output -- all the lines of output are then displayed to the
screen.
How can I do this in Java? I am assuming I can write a puts() routine
that is overloaded in some way so I can pass a single string or an
array of strings and either way it does what I want.
You can.
I tried this and
it seems to be proper syntax (inside a class with a main()):
It isn't the best way to achieve what you want.
Display.java:
package com.myorg.utils;
pubic class Display {
public static void puts( String[] args ) {
for (int i=0; i<args.length; i++)
__puts( arg[i] );
}
public static void puts( String arg ) {
__puts( arg );
}
private static void __puts( String arg )
{ System.out.println( arg ); }
Ick. You save ~24 chars at the expense of ~70. Poor tradeoff.
}
TestPuts.java
import com.myorg.utils.Display;
public class TestPuts {
public static void main( String[] args ) {
puts( "A single string test." );
// This is specifically where I seem to be having trouble
passing a
// String[] array to the puts( String[] args ) call
implementation.
// But maybe the implementation itself in the Display class
isn't
// the way to go?
It isn't.
puts( {
"This is line 1",
"This is line 2",
"This is line 3"
} );
}
private static void puts( String[] args ) { Display.puts( args ); }
private static void puts( String arg ) { Display.puts( arg ); }
Ick! In most languages, when I find myself writing ugly code, I'm
certain there is a better way to write it. Occasionally there isn't of
course.
}
Everything seems fine as far has the implementation goes in the
Display class. But maybe that's the wrong way to go about it?
Yes.
I
can't believe I have to use a fifty letter package name class method
to print a line to the console.
You don't, though Java I/O is overly complex IMHO.
(This is one of the things I hate about Java, but anyway...)
There's things I hate about Perl, that doesn't stop me loving Perl!
Generally I try not to rant about language X in a language Y forum.
It antagonises potential helpers.
So... Someone who knows Perl and Java both... Maybe you can help me
out. Or someone who knows Java can at least see what I am attempting
to do. Again, this seems extremely bogus to even have to do. Look
how elegant the Perl solution is...
Stop pining for Perl. You'll feel better.
But I should get off my soapbox I guess and just ask for help.
You really should have.
(Can you tell I'm irritated that I have to learn Java???!!! :-))
You're the only one who will be harmed by having that attitude. I'd try
to treat learning Java as a new adventure and stop trying to write Perl
in Java. They are very different languages - I'd try to accept that.
YMMV :-)
------------------------------8<----------------------------------
package org.redgrittybrick.test;
import static org.redgrittybrick.test.PutUtils.*;
import java.io.IOException;
public class PutsTest {
public static void main(String[] args) throws IOException {
puts( "A single string test." );
puts( new String[] {
"This is line 1",
"This is line 2",
"This is line 3"
});
puts(exec("cmd /c dir"));
}
}
------------------------------8<----------------------------------
package org.redgrittybrick.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class PutUtils {
public static void puts(String... args) {
for (String arg : args)
System.out.println("["+arg+"]");
}
public static String exec(String cmdline) throws IOException {
Process p = Runtime.getRuntime().exec(cmdline);
BufferedReader input = new BufferedReader( //
new InputStreamReader(p.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = input.readLine()) != null)
sb.append(line+"\n");
input.close();
return sb.toString();
}
}
------------------------------8<----------------------------------
I can't help feeling that exec() could be written a lot more concisely
and elegantly.
--
RGB