2012-09-17 107 views
9

我有一個是在一個提示輸入一個變量:追加字符串變量,以一個固定的字符串在Perl

my $name = <>; 

我要追加固定字符串'_one'此(在一個單獨的變量)。

E.g.如果$name = Smith則變得'Smith_one'

我嘗試了好幾種不同的方式不給我正確的結果,如:

my $one = "${name}_one"; 

^的_one出現在下線的時候我把它打印出來,當我使用它,_one根本不包括在內。

另外:

my $one = $name."_one"; 

^的'_one'出現在開頭的字符串

和:

my $end = '_one'; 
my $one = $name.$end; 
or 
my $one = "$name$end"; 

這些都不產生我想要的結果,所以我必須失去涉及到如何輸入從提示格式化的東西,也許是。想法讚賞!

回答

21

您的問題是不相關的字符串追加:當讀出的線(例如,經由<>),則記錄輸入分離器包含在該字符串;這通常是換行\n。要刪除換行符,chomp變量:

my $name = <STDIN>; # better use explicit filehandle unless you know what you are doing 
    # now $name eq "Smith\n" 
    chomp $name; 
    # now $name eq "Smith" 

爲了內插一個變量爲一個字符串,通常不需要你使用${name}語法。這些生產線都將追加_one到您的字符串,並創建一個新的字符串:

"${name}_one" # what you used 
    "$name\_one" # _ must be escaped, else the variable $name_one would be interpolated 
    $name . "_one" 
    sprintf "%s_one", $name 
    # etc. 

這將追加_one到您的字符串,仍然存放在$name

$name .= "_one" 
+0

唉唉作爲有關換行符有趣性格 - chomp立即解決問題!我也嘗試過追加這些方法,但沒有運氣 - 但現在它們都可以工作了!謝謝! – dgBP

+2

有趣;我在考慮使用'「$ {name} _one」比'「$ name \ _one」'或$ $ name這樣的笨拙構造要好得多。 「_ONE」'。 –

+0

@JonathanLeffler感謝您的編輯。到目前爲止,我還處在「'{foo}」語法清晰,而不是一個不合時宜的bash-ism陣營,而且我的原始建議更糟糕。我已經編輯過。 – amon