2010-03-08 192 views
1
$w = 'self-powering'; 
%h = (self => 'self', 
     power => 'pauә', 
    ); 
if ($w =~ /(\w+)-(\w+)ing$/ && $1~~%h && $2~~%h && $h{$2}=~/ә$/) { 
    $p = $h{$1}.$h{$2}.'riŋ'; 
     print "$w:"," [","$p","] "; 
} 

我希望可以將輸出爲爲什麼這段代碼沒有做到我的意思?

self-powering: selfpauәriŋ 

但我得到的是:

self-powering: [riŋ] 

我的猜測是,什麼是錯的代碼

$h{$2}=~/ә$/ 

看來,當我用

$h{$2}!~/ә$/ 

Perl會做我的意思,但爲什麼我不能得到「self-powering:selfpauәriŋ」? 我在做什麼錯?有任何想法嗎?

感謝一如既往任何的意見/建議/指針:)

+4

我很少得到任何代碼來做我的意思。 *嘆*。 – 2010-03-08 13:05:58

+0

你使用什麼字符編碼? UTF-8?你有沒有讀過http://perldoc.perl.org/utf8.html? – Boldewyn 2010-03-08 13:10:58

+0

@Boldewyn,謝謝你離開評論。但是這個問題與UTF-8編碼無關。該腳本被保存爲UTF-8格式,並且可以按照預期輸出內容,而無需在我的Windows機器上進行任何腳本編碼處理。 – Mike 2010-03-08 13:41:52

回答

6

當您運行

$h{$2}!~/ә$/ 

在你的if語句的$ 1和$ 2中的內容發生了變化是空的,因爲沒有分組是匹配(沒有)。如果你這樣做:

if ($w =~ /(\w+)-(\w+)ing$/){ 
    my $m1 = $1; 
    my $m2 = $2; 
    if($m2~~%h && $m2~~%h && $h{$m2}=~/ә$/) { 
     $p = $h{$m1}.$h{$m2}.'riŋ'; 
     print "$w:"," [","$p","] "; 
    } 
} 

我希望你會得到你想要的。

+0

@Sorpigal,所以代碼突然變得複雜:(但是,謝謝,謝謝,非常感謝,「$ 1和$ 2的內容被更改爲空」,這是問題的癥結:)我一直在那裏停留了很長時間。現在我明白我做錯了什麼。謝謝! – Mike 2010-03-08 13:39:22

1

您是否啓用use warnings?這會告訴你,$1$2不是你所期望的。一旦你輸入if塊,你的第二個正則表達式,而不是第一個,決定這些變量的值。用一個更簡單的例子來說明:

print $1, "\n" 
    if 'foo' =~ /(\w+)/ 
    and 'bar' =~ /(\w+)/; 
+0

@FM,代碼是我編碼的玩具程序的簡化版本,有大約300行。我已經爲我提到的問題找到了解決方法。那麼我剛剛檢查了代碼,不,我沒有啓用警告,啊,這是另一個問題。感謝您的插圖代碼。我感覺自己很開朗:) – Mike 2010-03-08 14:03:22

+1

你應該總是使用嚴格;並使用警告;即使在「玩具」代碼中。當你修復所有錯誤和警告時,你的代碼會更好。 – Sorpigal 2010-03-08 14:09:09

+1

@Mike:這不是你第一次被勸告總是使用嚴格和警告。請開始注意這個建議;你會更快樂,更高效:) – Ether 2010-03-08 18:22:15