2011-12-19 61 views
1

我對Java非常陌生(本週末剛剛開始),並且擁有Perl的背景。所以我有一個問題:與Perl的鑽石算子<>相當的Java是什麼?

什麼是Java相當於Perl鑽石操作員(<>)?

所以基本上是Java的等價於:

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

提前感謝!


對於那些不懂行的Perl:

作爲所使用的,<>是短期的readline(ARGV),其中ARGV是表示任一STDIN(如果沒有參數被傳遞給程序)的特殊文件手柄或將作爲參數傳遞給程序的文件內容連接起來。 readline不會刪除行終止符。

+1

它是做什麼的? – SLaks 2011-12-19 23:49:46

+0

@SLaks:做什麼? – Dynamic 2011-12-19 23:50:19

+0

鑽石運算符 – SLaks 2011-12-19 23:52:07

回答

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

Perl中菱形運算符的美妙之處在於它從標準輸入讀取__unless__用戶指定一些輸入文件作爲參數。在那種情況下,鑽石操作員讀取__all__這些文件中的行。該代碼只能從STDIN中讀取。 – 2014-07-10 15:25:15

5

這將是new BufferedReader(new InputStreamReader(System.in))(或new Scanner(System.in),根據您的需要)。

但請注意,它不是嚴格相當於perl的鑽石操作員,因爲鑽石操作員受$/的影響。在Java中,你不得不這樣做。

爲了完整起見,System.in是一個InputStream(也恰好是stdin)。

+0

他沒有改變'$ /',所以這是沒有意義的。從作爲參數傳遞的文件讀取'System.in'嗎? – ikegami 2011-12-20 00:37:38

1

我懷疑有一個Java等同<> does more than just read from 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中的所有項目解釋爲文件名,則可以使用CPAN中的模塊ARGV::readonly

只要數組最終包含您真正想要的文件名列表,您就可以在第一個<>之前修改@ARGV。行號($.)繼續,好像輸入是一個大快樂文件。請參閱eof中的示例瞭解如何重置每個文件的行號。