Что такое Java-эквивалент оператора Perl <>? - PullRequest
1 голос
/ 20 декабря 2011

Я чрезвычайно новичок в Java (только начал в эти выходные) и имею опыт работы с Perl.Итак, у меня есть вопрос:

Что такое Java-эквивалент оператора Perl Diamond (<>)?

Так что в основном то, что эквивалентно Java:

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

Заранее спасибо!


Для тех, кто не знает Perl:

В используемом смысле <> - это сокращение от readline(ARGV), где ARGVспециальный дескриптор файла, представляющий либо STDIN (если в программу не было передано ни одного аргумента), либо конкатенацию содержимого файлов, переданных в качестве аргумента программе.readline не удаляет терминатор строки.

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Это будет new BufferedReader(new InputStreamReader(System.in)) (или new Scanner(System.in), в зависимости от ваших потребностей).

Обратите внимание, что он не строго эквивалентен алмазному оператору Perl, поскольку на алмазного оператора влияет $/. В Java вам придется делать это по-другому.

И просто для полноты System.in - это InputStream (а также, случается, это stdin).

4 голосов
/ 20 декабря 2011

Ну, 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));
    }
}
1 голос
/ 20 декабря 2011

Я сомневаюсь, что есть эквивалент Java, поскольку <> делает больше, чем просто читает из STDIN:

Нулевой файловый дескриптор <> является особенным: его можно использовать для эмуляции поведения 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> как немагический.)

Поскольку нулевой файловый дескриптор использует форму открытия с двумя аргументами, он интерпретирует специальные символы, поэтому, если у вас есть такой скрипт:

while (<>) {
   print;
}

и вызов его с помощью perl dangerous.pl 'rm -rfv *|', он фактически открывает канал, выполняет команду rm и считывает вывод rm из этого канала. Если вы хотите, чтобы все элементы в @ARGV интерпретировались как имена файлов, вы можете использовать модуль ARGV :: readonly из CPAN.

Вы можете изменить @ARGV перед первым <>, пока массив заканчивается списком имен файлов, которые вам действительно нужны. Номера строк ($.) продолжаются, как если бы ввод был одним большим счастливым файлом. См. Пример в eof о том, как сбросить номера строк в каждом файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...