2017-02-19 2 views
3

이중 백 슬래시 \\ 문자를 포함하는 문자열 (작은 따옴표)을 어떻게 인쇄 할 수 있습니까? Perl을 어떻게해서 단일 슬래시로 내 보냅니다. \? 더 많은 이스케이프 문자를 추가하여 문자열을 변경하고 싶지 않습니다.Perl이 이중 백 슬래시를 단일 백 슬래시 문자로 해석하지 못하게하려면 어떻게해야합니까?

my $string1 = 'a\\\b'; 
print $string1; #prints 'a\b' 

my $string1 = 'a\\\\b'; 
    #I know I can alter the string to escape each backslash 
    #but I want to keep string as is. 
print $string1; #prints 'a\\b' 

#I can also use single-quoted here document 
#but unfortunately this would make my code syntactically look horrible. 
my $string1 = <<'EOF'; 
a\\b 
EOF 
print $string1; #prints a\\b, with newline that could be removed with chomp 
+0

Windows 파일 경로를 처리하겠습니다. – Schwern

+0

아니요 단일 인용 문자열을 서브 루틴으로 전달하고 해당 문자열에 이중 백 슬래시가 포함되어 있습니다. – Omar

+0

오. 예를 들어 주시겠습니까? 작은 따옴표 안에서 큰 따옴표를 벗어나지 않아야합니다. 그녀는 "큰 따옴표로 큰 따옴표를 벗어날 필요가 없다"고 말했다. 보간을 원하지만 큰 따옴표를 이스케이프하지 않으려면'qq []'를 사용합니다. – Schwern

답변

9

유일한 모든 단일 인용 여기 문서입니다에서 백 슬래시를 해석하지 않는 Perl로 구성 인용 :

my $string1 = <<'EOF'; 
a\\\b 
EOF 
print $string1; # Prints a\\\b, with newline 

여기-문서가 라인을 기반으로하기 때문에, 당신이 것이다 불가피 문자열 끝에 줄 바꿈을 넣지 만, chomp으로 제거 할 수 있습니다.

기타 기술은 간단히 살고 문자열을 올바르게 (작은 양의 데이터로) 역 슬래시하거나 __DATA__ 섹션이나 외부 파일 (대용량 데이터의 경우)에 넣는 것입니다.

+1

나는 그것을 몰랐다! – Schwern

+0

여기에 나와있는 각 문자열에 대한 단일 인용 부호가있는 솔루션은 내 코드를 구문 적으로 끔찍하게 보일 것입니다. – Omar

+0

@Omar 글쎄, 난 그냥 사실을 정리하고있어.백 슬래시를 백 슬래시로 처리하거나, heredocs를 사용할 수도 있고, Perl 소스 파일이 아닌 다른 경로를 유지할 수도 있습니다. 내가 아는 한 최선의 방법으로는 합리적인 옵션이 없기 때문에, 가장 좋아하는 것을 선택하십시오 :) – hobbs

0

백 슬래시 보간은 문자열 리터럴에서 발생하기 때문에 다른 임의의 기호를 사용하여 리터럴을 선언 한 다음 나중에 다른 것으로 대체 할 수 있습니다.

my $string = 'a!!!b'; 
$string =~ s{!}{\\}g; 
print $string; #prints 'a\\\b' 

는 물론 그것은 !, 할 것 문자열에 일반 문자와 충돌하지 않는 기호 일 필요는 없습니다. 당신은 당신이 함수

sub bs { 
    $_[0] =~ s{!}{\\}gr 
} 

my $string = 'a!!!b'; 
print bs($string); #prints 'a\\\b' 

P.S.의 대체를 넣을 수 있도록, 문자열의 숫자를해야했다 해당 함수는 v5.14에 소개 된 비파괴 치환 수정 자 /r을 사용합니다. 당신이 이전 버전을 사용하는 경우, 함수는이

sub bs { 
    $_[0] =~ s{!}{\\}g; 
    return $_[0]; 
} 

처럼 작성해야 또는 것 당신은 당신이 약간 미친 경우

sub bs { 
    my $str = shift; 
    $str =~ s{!}{\\}g; 
    return $str; 
} 
6

더 읽기 뭔가를 좋아하고, 경우의 생각처럼 오늘 아침부터 CPAN에서 Syntax::Keyword::RawQuote 모듈을 사용할 수있는 코드의 미학을 향상시키기 위해 perl의 내부와 관련된 실험용 소프트웨어를 사용합니다.

use syntax 'raw_quote'; 
my $string1 = r'a\\\b'; 
print $string1; # prints 'a\\\b' 

영감을 얻으 려던 @melpomene에게 감사드립니다.

+0

이것은 영감을줍니다. – zdim

관련 문제