【问题标题】:What is the Java equivalent to Perl's diamond operator <>?与 Perl 的菱形运算符 <> 等效的 Java 是什么?
【发布时间】:2012-01-24 01:02:05
【问题描述】:

我对 Java 非常陌生(本周末才开始)并且有 Perl 背景。所以我有一个问题:

Java 中的 Perl 钻石运算符 () 是什么?

所以基本上Java相当于:

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

提前致谢!


对于那些不了解 Perl 的人:

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

【问题讨论】:

  • @SLaks 菱形运算符根据 '$/' 的值读取流,这相当于 shell 的 IFS。默认不指定流时为stdin。

标签: java input io


【解决方案1】:

那就是new BufferedReader(new InputStreamReader(System.in))(或new Scanner(System.in),取决于您的需要)。

但请注意,它严格不等同于 perl 的菱形运算符,因为菱形运算符受$/ 的影响。在 Java 中,您必须以不同的方式执行此操作。

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

【讨论】:

  • 他没有改变$/,所以这没有实际意义。 System.in 是否从作为参数传递的文件中读取?
【解决方案2】:

嗯,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));
    }
}

【讨论】:

  • Perl 中菱形运算符的美妙之处在于它从标准输入中读取除非用户指定了一些输入文件作为参数。在这种情况下,菱形运算符会从 all 那些文件中读取行。此代码仅从 STDIN 读取。
【解决方案3】:

我怀疑是否存在与 &lt;&gt; does more than just read from STDIN 等效的 Java:

空文件句柄&lt;&gt; 很特别:它可以用来模拟sed 和awk 的行为。 &lt;&gt; 的输入要么来自标准输入,要么来自命令行中列出的每个文件。它是这样工作的:第一次评估&lt;&gt;,检查@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&lt;&gt; 只是 &lt;ARGV&gt; 的同义词,很神奇。 (上面的伪代码不起作用,因为它将&lt;ARGV&gt; 视为非魔法。)

由于空文件句柄使用 open 的两个参数形式,它会解释特殊字符,所以如果你有这样的脚本:

while (<>) {
   print;
}

并用perl dangerous.pl 'rm -rfv *|' 调用它,它实际上打开了一个管道,执行rm 命令并从该管道读取rm 的输出。如果您希望 @ARGV 中的所有项目都被解释为文件名,您可以使用 CPAN 中的模块 ARGV::readonly

只要数组最终包含您真正想要的文件名列表,您就可以在第一个 &lt;&gt; 之前修改 @ARGV。行号 ($.) 继续,好像输入是一个快乐的大文件。请参阅eof 中的示例了解如何重置每个文件的行号。

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2014-04-07
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多