我是Java的新手(刚刚本周末开始),并且拥有Perl的背景知识。所以我有一个问题:
与Perl Diamond Operator(<>)等效的Java是什么?
所以基本上什么是Java相当于:
print "What is your name?";
my $name = <>;
print "Hello, $name!";
提前致谢!
对于那些不了解Perl的人:
使用时,<>
是readline(ARGV)
的缩写,其中ARGV
是一个特殊的文件句柄,代表STDIN
(如果没有参数传递给程序)或作为参数传递给程序的文件内容的串联。 readline
不会删除行终止符。
答案 0 :(得分:5)
那将是new BufferedReader(new InputStreamReader(System.in))
(或new Scanner(System.in)
,具体取决于您的需求。)
但请注意,它不是严格等同于perl的菱形运算符,因为菱形运算符受$/
的影响。在Java中,你必须以不同的方式做到这一点。
仅仅为了完整性,System.in
是InputStream
(也恰好是标准输入)。
答案 1 :(得分:4)
嗯,java不是一种脚本语言,它是为不同的东西而设计的。
无论如何,java中的类似代码可能如下所示:
public class Readline {
public static void main(String[] args) throws java.io.IOException {
System.out.print("What is your name?");
java.io.BufferedReader stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
String name = stdin.readLine();
System.out.println("Hello %s\n".format(name));
}
}
答案 2 :(得分:1)
我怀疑Java等价物为<>
does more than just read from STDIN
:
null文件句柄
<>
很特殊:它可以用来模拟sed和awk的行为。<>
的输入来自标准输入,或来自命令行中列出的每个文件。以下是它的工作原理:第一次评估<>
时,检查@ARGV
数组,如果它是空的,$ARGV[0]
设置为“ - ”,打开时会给你标准输入。然后将@ARGV
数组作为文件名列表处理。循环while (<>) { ... # code for each line }
等效于以下类似Perl的伪代码:
unshift(@ARGV, '-') unless @ARGV; while ($ARGV = shift) { open(ARGV, $ARGV); while (<ARGV>) { ... # code for each line } }
除了说它并不那么麻烦,并且实际上会有效。它确实会移动
@ARGV
数组并将当前文件名放入$ARGV
变量中。它还在内部使用文件句柄ARGV
。<>
只是<ARGV>
的同义词,这是神奇的。 (上面的伪代码不起作用,因为它将<ARGV>
视为非魔法。)由于null文件句柄使用open的两个参数形式,它会解释特殊字符,所以如果你有这样的脚本:
while (<>) { print; }
并使用
perl dangerous.pl 'rm -rfv *|'
调用它,它实际上打开一个管道,执行rm
命令并从该管道读取rm
的输出。如果您希望@ARGV
中的所有项目都被解释为文件名,则可以使用CPAN中的模块ARGV::readonly。只要数组最终包含您真正想要的文件名列表,您就可以在第一个
@ARGV
之前修改<>
。行号($.
)继续,好像输入是一个很大的快乐文件。请参阅eof中的示例,了解如何重置每个文件的行号。