2014-07-15 61 views
0

這個問題與我昨天問過的一個問題有關。我是Perl的新手,並且仍然掌握着很多東西*。在代碼中,我試圖用撇號替換正確的單引號。但是,我不想用單引號來替換正確的單引號。一個例子是:關於Perl Regexes的查詢

He said the movie was 'magnificent.' 

這裏是我目前正在使用的代碼:

#!/usr/bin/perl 
use strict; 
use warnings; 

# Subroutine prototype 
sub problem_character(); 

my $previousPosition=0; 
my $currentPosition=0; 

#Locates problematic apostrophes and replaces them with properly encoded apostrophes 
sub problem_character(){ 
    while($_[0]=~m/\x{2019}/g){ 
     $currentPosition=pos($_[0]); 
     pos($_[0])=$previousPosition; 
     unless(....){ 
      $_[0]=~s/\x{2019}/\x{0027}/g; 
     } 
     $previousPosition=$currentPosition; 
    } 
} 

首先,我不知道我會放在除非檢查。我希望能夠檢查匹配的正確單引號是否是單引號單詞的一部分。另外,在Perl文檔中,pos函數是最後一次搜索的最後一個m//q偏移量。替換搜索是否也屬於這一類別?最後,有沒有更簡單的方法來編寫這種類型的代碼?謝謝。

*有人知道我可以拿起一本好書,詳細解釋危險嗎?我發現在線資源相當混亂。

+1

我找到了「學習Perl的」非常有益的,當我開始使用Perl。 – toolic

+0

我使用了Perl Docs,StackOverflow,只是這一個教程:http://qntm.org/files/perl/perl.html,我想我很快學會了這一點。 – chilemagic

+0

查看O'Reilly&Associates發佈的所有Perl書籍。 _編程Perl_是我從20年前學到的。 – Barmar

回答

0

你發佈你具備以下條件:

He said the movie was 'magnificent.' 

但是你說你想取代中不存在該字符串。你真的有以下幾點嗎?

He said the movie was ‘magnificent.’ 

如果是這樣,簡單的解決方案將是,以取代未由前面的匹配所有。不過,實施起來有點棘手。

s{ 
    \G 
    (?: [^\x{2018}\x{2019}]++ 
    | \x{2018} [^\x{2018}\x{2019}]*+ \x{2019}?+ 
    )*+ 
    \K 
    \x{2019} 
}{'}xg; 

簡單(但有點低效率)的實現:

$_ = reverse($_); 
s/\x{2019}(?![^\x{2018}\x{2019}]*\x{2018})/'/g; 
$_ = reverse($_); 

順便說一句,你可以實際使用的字符在正則表達式模式,如果你想。只要確保使用UTF-8編碼的文件,就告訴Perl你這樣做使用use utf8;

use utf8; # Source code is encoded using UTF-8. 

$_ = reverse($_); 
s/’(?![^‘’]*‘)/'/g; 
$_ = reverse($_); 
+0

是的,謝謝。這正是我所期待的。 – user3639182

+0

@ user3639182 [如果答案可以幫助你](https://stackoverflow.com/help/someone-answers),然後考慮[接受它](https://meta.stackexchange.com/q/5234/230282) –