2017-12-21 2 views
2

예를 들어 이모티콘 unicode caracter가 포함 된 텍스트 파일을 가지고 있습니다. ☹️,,,,,,,.Perl에서 이모티콘을 유니 코드로 감지하는 방법은 무엇입니까?

예를 들어, 코드 \ N {1F60D}는 에 해당합니다. https://perldoc.perl.org/perluniintro.html 섹션 유니 코드 만들기의 권장 사항을 사용합니다. 내 프로그램을 감지하고 어떤 치료를 수행하지만 난

open(FIC1, ">$fic"); 

while (<FIC>) { 
my $ligne=$_; 

if($ligne=~/\N{1F60D}/ ) 
{print "heart "; 
    } 
} 

를 사용하는 경우 지금은 이렇게, 그것은 첫 번째 코드 감사의 문제점은 무엇

open(FIC1, ">$fic"); 

while (<FIC>) { 
my $ligne=$_; 

if($ligne=~// ) 
{print "Heart "; 
    } 
} 

을 일해야

+1

어떤 perl 버전을 사용하고 있습니까? 'perl -v'와 어떤 플랫폼입니까? –

+0

@Flying_whale : 나는 당신이 권장 한 모든 것을했지만 아무 것도 바뀌지 않았습니다. –

+0

@Nahuel Fouilleul : MSWin32-x64 멀티 스레드 용으로 만들어진 perl 5, version 22, subversion 1 (v5.22.1) –

답변

7

에 대해 perldoc perlre을 보면 "유니 코드 문자 또는 문자 시퀀스"라는 의미입니다.

당신이 대신 사용할 수 있습니다

if ($ligne =~ m/\N{U+1F60D}/) 
# or 
if ($ligne =~ m/\x{1F60D}/) 

편집 : 그것은 또한 당신이 게시 된 링크에 설명 된 것 https://perldoc.perl.org/perluniintro.html

편집 : 당신이 읽은 내용이 아마 을 디코딩하지 않습니다. 당신이 원하는 :

use Encode; 
... 
my $ligne = decode_utf8 $_; 

하거나 직접 UTF8 모드에서 파일을 엽니 다

open my $fh, "<:encoding(UTF-8)", $filename or die "Could not open $filename: $!"; 
while (my $ligne = <$fh>) { 
    if ($ligne =~ m/\N{U+1F60D}/) { ... } 
} 

당신은 당신이 FIC라는 파일 핸들을 열 방법을 보여주지 않았다, 그래서 나는 그것이 UTF8 디코딩했다 추측했다. https://perlgeek.de/en/article/encodings-and-unicode

+0

미안하지만 이것도 작동하지 않는다. 똑같은 것이다. 또한 \ x로 테스트했는데 작동하지 않습니다. –

+2

나는 m을 추가하지 않았습니다. 좀 더 가까이에서보세요. 나는'U +'를 추가했다 – tinita

+1

대단히 고맙습니다. 문제는 파일 열기에있었습니다. 그래서 제 문제를 해결 한 것은 저의 명령입니다. $ ligne = decode_utf8 $ _; , 고맙습니다. –

2

사용 perl -C 유니 기능

perl -C -E 'say "\N{U+263a}"'|perl -C -ne 'print if /\N{U+263a}/' 

from perl run

-C [개/목록]

을 활성화하는데 사용될 수있다 : 여기 펄 유니 대한 또 다른 좋은 가이드는 -C 플래그는 Perl 유니 코드 기능 중 일부를 제어합니다. perl -ne 'print if /\xf0\x9f\x98\x8d/'에서 같이 ... 두 번째 코드가 작동하는 이유

이유는 펄이 UTF-8 진 순서와 일치한다는 것입니다.

감지 이모티콘 들어

#!/usr/bin/perl -C 
open(FIC1, ">$fic"); 

while (<FIC>) { 
    my $ligne=$_; 

    if($ligne=~/\N{U+1F60D}/ ) { 
     print "heart "; 
    } 
} 
+0

나는 perl -C를 시도하지만, 아무런 일도 일어나지 않았다. 오랜 시간이 걸린다. 내 프로그램 #!/usr/bin/perl -C를 추가하면 터미널 차단이되었다고 생각하지만, 두 번째 명령은 그것을 사용하는 방법을 이해하지 못합니다 –

+0

그럼 두 번째 코드가 작동하지 않습니까? –

+0

주어진 예제는 명령 행에서 테스트하는 것이고, -e 또는 -E + 명령을 사용하지 않으면 perl 프로그램이 명령을 읽는 입력을 기다리는 중입니다. 작동하지 않으면'U +'가 누락되었을 수 있습니다 –

6

를 작동해야 다음, 나는 예를 들어, 정규 표현식에, 유니 코드 속성을 사용합니다:

  • \p{Emoticons} 또는
  • \p{Block: Emoticons}

예를 들어,

perl -CSDA -nlE 'say for(/(\p{Emoticons})/g)' <<< 'abcαβγ' 

012를 참조 더 많은 정보




를 인쇄에만 이모티콘을 인쇄

관련 문제