2014-02-06 64 views
4

有人能幫我糾正我下面的代碼。 我想從輸入字符串中提取兩個數字。Perl:從字符串中提取多個數字

input string [7:0] xxxx 

我想'7'和'0'被加載到兩個變量(最小和最大)。 我試圖通過

my ($max, $min); 
($max, $min) = $_ =~ /[(\d+):(\d+)]/; 
print "min: $min max $max\n"; 

我得到一個結果作爲

Use of uninitialized value in concatenation (.) or string at constraints.pl line 16, <PH> line 165. 
min: max: 1 

問候

+0

如果你正在解析Verilog ... https://metacpan.org/pod/Verilog-Perl – toolic

+0

出於好奇,你爲什麼選擇接受Jassi的答案,而不是我的? – TLP

+0

TLP,我實際上想要選擇兩個(我以爲我做過),但系統不允許這樣做,Jassi是在您之後選擇的,因此它顯示了wat。對不起,我並不是故意冒犯你。 – user1495523

回答

7

[]是正則表達式元字符來實現這一點,所以你要逃避他們

($max, $min) = $_ =~ /\[(\d+):(\d+)\]/; 

括號用於書房請注意角色類別:[ ... ],它與其中的字符相匹配[abc]匹配a

+1

此外,你可以合併第1行和第2行,就像這樣:'我($ max,$ min)= $ _ =〜/ [(\ d +):(\ d +)] /;'我喜歡聲明和賦值只要有可能就一步到位。 – Andrejovich

+1

@Andrejovich如果你保留反斜槓,是的,你可以。通常,我會說你會看到它們的最短形式:'my($ max,$ min)=/\ [(\ d +):(\ d +)\] /',其中'$ _ =〜''部分是隱含的。這通常讓初學者感到困惑。 – TLP

+0

噢,你說的沒錯。我應該複製/粘貼*你的*代碼,而不是OP的。 – Andrejovich

0

TLP是正確的。 []是元字符和任何這樣的字符是必需的逃脫像。 () [] *等來使用它進行文字匹配。 這將解決您的問題。

($max, $min) = $_ =~ /\[(\d+):(\d+)\]/; 

你可能會得到警告,如果$max$min或兩者都是空白的,即[ 7: ][ : ][ : 2][ ]