2016-05-31 38 views
1

我試圖寫一個Perl程序採取兩種不同的輸入:Perl程序通過STDIN

print "Enter the filename:"; 
    $filename = readline STDIN; 

    print "Enter the string to be compared"; 
    $string1 = readline STDIN; 

要一氣呵成這兩個輸入相結合,我做了以下內容:

print "Enter the filename and string to be compared:"; 
    my $input1 = readline STDIN; 
    my @name = split(' ',$input1); //split the input parameters by space 
    $filename = $name[0]; 
    $string1 = $name[1]; 
    chomp $string1; 

這是功能性代碼,我想知道是否有其他方法可以爲此邏輯實現更優化的版本?

感謝, DD

+2

定義*優化*! – salva

+0

我不會建議你以這種方式進行優化。如果文件名將包含空格,你會做什麼?邏輯會增加。看@ mkHun不要。 –

+0

看看http://perldoc.perl.org/Getopt/Long.html – Toto

回答

5

這是我們所優化爲您獲取有關kite什麼。在確定需要之前,不要試圖手動優化代碼。鑑於這是一個等待IO,它將不重要,因爲IO比你在代碼中做的任何事都慢。

但如果你的意思是更簡潔

print "Enter the filename and string to be compared:"; 
chomp (my ($filename, $string) = split ' ', <>); 

這需要<> - 這是一個神奇的文件句柄,並讀取要麼標準輸入或命令行中指定的文件名。 (像grep/sed/awk那樣工作)。

我們將它在標量上下文中分割 - 然後將值從split分配到列表分配$filename$string。然後它將被切掉以消除換行。

2

Perl的祕密

use warnings; 
use strict; 
print "Enter the filename and string to be compared:"; 
chomp(my @ar = (~~<>, ~~<>)); 
print @ar;   
+3

雖然很聰明,但我並不確信'perl secret'中的任何東西都是你應該在實際代碼中使用的東西,因爲它很晦澀。 – Sobrique

+0

'標量(<>)'或'「」。<>'會少一些「祕密」。 //注意,在返回EOF之後從文件句柄中讀取是一個不允許的,所以這種方法本質上是有缺陷的。 – ikegami

0

嘗試使用代碼波紋管與 `COMAND:Perl的your_script.pl -file_name 'SOME_FILE' -string 'some_string'

use Getopt::Long; 

my ($file_name, $string); 
GetOptions(
'file_name=s' => \$file_name, 
'string=s' => \$string, 
) or die "Could not parse options"; 

if($file_name eq $string) 
{ 
print "The file name is the same as the string\n"; 
}else{ 
print "Not a match\n"; 
}