与Perl的钻石运算符相同的Java是什么<>?

时间:2011-12-19 23:48:50

标签: java input io

我是Java的新手(刚刚本周末开始),并且拥有Perl的背景知识。所以我有一个问题:

与Perl Diamond Operator(<>)等效的Java是什么?

所以基本上什么是Java相当于:

print "What is your name?";
my $name = <>;
print "Hello, $name!";

提前致谢!


对于那些不了解Perl的人:

使用时,<>readline(ARGV)的缩写,其中ARGV是一个特殊的文件句柄,代表STDIN(如果没有参数传递给程序)或作为参数传递给程序的文件内容的串联。 readline不会删除行终止符。

3 个答案:

答案 0 :(得分:5)

那将是new BufferedReader(new InputStreamReader(System.in))(或new Scanner(System.in),具体取决于您的需求。)

但请注意,它不是严格等同于perl的菱形运算符,因为菱形运算符受$/的影响。在Java中,你必须以不同的方式做到这一点。

仅仅为了完整性,System.inInputStream(也恰好是标准输入)。

答案 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中的示例,了解如何重置每个文件的行号。