2009-01-09 52 views
9

當我說簡單的時候,我的意思是,在一個表達式中,這樣我就可以將它作爲哈希值存儲起來,而不用先準備好。我會發布我的解決方案,但我正在尋找一個更好的,讓我想起更少的VB。 :)在Perl中返回多行字符串的第一行的最簡單方法是什麼?

+0

爲什麼厭惡提前準備它?它通常需要花哨的魔咒作爲單線,這與簡單相反。雖然找出這些東西很有趣,但在真正的程序中使用它們並不是一個好主意,因爲您獲得的鴿友越多,後來就越難明白。 – 2009-01-09 13:56:27

+0

這是一個臨時解決方案。 :)雖然好點。 – Kev 2009-01-09 14:00:10

回答

23

如何

(split /\n/, $s)[0] 

您不必擔心\ n不是跨平臺的,因爲Perl is clever enough to take care of that

+0

謝謝,那就是我一直在尋找的!我也期待着閱讀那篇文章,因爲過去我曾經遇到過線路問題,但也許這不是Perl的錯。 – Kev 2009-01-09 13:59:00

+0

那麼,Perl使\ n在不同系統上表示不同的東西,但這並不意味着\ n是輸入的記錄分隔符。 :) – 2009-01-09 21:03:18

0
substr($s, 0, index($s, $/) > -1 ? index($s, $/) ||()) 
+0

大聲笑,哎呀...謝謝! – Kev 2009-01-09 21:04:02

4

這不像你喜歡的那麼簡單,但簡單就是簡短就不應該總是目標。

您可以在一根繩子上打開一個文件句柄(作爲一個標量基準),並把它當作一個文件中讀取第一行:

 
my $string = "Fred\nWilma\Betty\n"; 
open my($fh), "<", \$string or die ...; # reading from the data in $string 
my $first_line = <$fh>; # gives "Fred" 
close $fh; 

如果你真的想要,我想你會這樣減少表達式:

$hash{$key} = do { open my($fh), "<", \$string; scalar <$fh> }; 

無論您選擇哪種方法,你總是可以做出一個子程序返回的第一行,然後使用您的哈希分配子程序調用。

 
sub gimme_first_line { ... } 

$hash{$key } = gimme_first_line(\$string); 
2
($str =~ /\A(.*?)$/ms)[0]; 

對於大字符串,這將是快於

(split /\n/, $str)[0] 

通過曼尼的建議。 [編輯:刪除錯誤提及split /\n/, $str, 1。]

如果要包含終端\n(如果存在),請在正則表達式的關閉paren之前添加\n?

相關問題