2013-04-23 5 views
-1

문자열 변수의 모든 백 슬래시를 보존하고 인쇄하는 방법은 있습니까? 예를 들어 은 : 출력은Perl 문자열에서 백 슬래시 보존

a\b 

$str = 'a\\b'; 

입니다

하지만 난

a\\b 

을 필요로하는 문제 I 때문에 백 슬래시를 이스케이프 어떤 방식으로 문자열을 처리 할 수있다 데이터베이스에서 복잡한 정규 표현식을 읽어야하고 어떤 조합과 숫자로 나타나는지 정확히 알지 못하고 웹에있는 것과 똑같이 인쇄해야합니다. 페이지.

템플릿 툴킷과 html 및 html_entity 필터를 사용해 보았습니다. 그것은 지금까지 작동하는 유일한 방법은 하나 여기에 인용 된 문서를 사용하는 것입니다

print <<'XYZ'; 
a\\b 
XYZ 

을하지만 나는이 솔루션은 쓸모가 만드는 변수를 보간 수 없습니다.

웹 페이지, 파일 및 셸에 문자열을 쓰려고했지만 행운은 없었습니다. 항상 백 슬래시가 하나 사라졌습니다. 어쩌면 나는 완전히 잘못된 길에 있을지 모르지만, 어떤 변경없이 모든 조합과 숫자에서 백 슬래시를 포함한 복잡한 정규 표현식을 인쇄하는 올바른 방법은 무엇입니까?

다른 말로 : 나는 수백 개의 정규 표현식이 문자열 데이터로 포함 된 데이터베이스를 가지고 있습니다. 필자는 perl로 그들을 읽고 데이터베이스에있는 것처럼 웹 페이지에서 그들을 멋지게 인쇄하고 싶습니다. 많은 관리자가이 정규 표현식에 모든 시간을 변경하므로 어떻게 탈출 할 것인지 미리 알 수 없습니다. 어쩌면 올바른 결론 정확히 어떤 조합하고있는 상관없이 나타나는 번호를 한 번 모든 백 슬래시를 탈출하는 것입니다 'C:\\test\\file \S+' 을하지만 '\S+ C:\\test\\file' 다음날을 변경할 수 있습니다 : 전형적인 예는 다음과 같을까요? 이것은 그것들을 두 배로 작동시키는 것을 의미합니다. 그러면 문제는 내가 두려워하는 것만 큼 크지는 않습니다. 나는 bash에서 그것을 테스트했고 2 행 3 행의 백 슬래시 (4 개의 백 슬래시는 2 개를 인쇄하고 6 개의 백 슬래시는 3 개를 인쇄 함)와 함께 작동합니다.

+5

원하는 것을 보여주세요. 백 슬래시가 변수에 포함되면 변경되지 않고 문자열로 보간 될 경우 올바르게 표시됩니다. 한 쌍의 역 슬래시를 문자열 * 리터럴 *에 넣는 유일한 방법은 문자열을 두 번 올리는 것이지만 문제가되지는 않습니다. 백 슬래시를 이스케이프 문자로 간주하는 여러 소프트웨어 계층이 있으므로 문제가 Perl 내에 있지 않을 수 있습니다. – Borodin

답변

2
my $str = 'a\\b'; 
print $str; 

이 출력물은 a\\b입니다.

사용 my $ str = 'a \\ b'; 대신

0

피타입니다.하지만 백 슬래시를 두 배 올려야합니다. 예 :

a\\\\b 

그렇지 않으면 다른 변수에 백 슬래시를 저장하고이를 삽입 할 수 있습니다.

use 5.016; 
my $a = 'a\\\b'; 
say $a; 
1

최소가 (불행하게도) 세 슬래시입니다.

편집 : 당신은 대신 보간을 사용할 수 있습니다

:

my $str = <<'EOF'; 
a\\b 
EOF 
print "$str\n"; 

이 여전히 a\\b를 인쇄합니다.

0

당신은 제대로 문자열을 형성하기 위해 다음과 같은 정규 표현식을 사용할 수 있습니다 :

my $str = 'a\\b'; 
$str =~ s/\\/\\\\/g; 
print "$str\n"; 

a\\b를 인쇄이 슬래시를 얻을 수

+1

감사합니다. 단, 문자열에서 백 슬래시를 두 배로 늘린 경우에만 작동합니다. additonal 하나의 백 슬래시가 있다면 출력에서 ​​두 배가됩니다. – Norbert

+0

사실, 참으로 ... –

1

는 펄 소스 코드, 예를 들면 발생할 때 백 슬래시는 펄에 의미가있다 : 변수에 리터럴 문자열의 과제 :

my $str = 'a\\b'; 

하지만, 당신이 파일에서 데이터를 읽고 (또는 경우 데이터베이스 또는 소켓 등) 읽은 데이터의 백 슬래시는 특별한 조치를 취할 필요없이 보존됩니다.

+1

예, 정확하게. 때로는 분명한 사실을 이해하는 데 시간이 필요합니다. 이제 모든 것이 명확합니다. 감사. – Norbert

1

해결하려는 문제가 없습니다. HTML 양식을 사용하여 코드에서 직접 문자열을 초기화하는 것을 혼란스럽게 생각합니다. 모든 백 슬래시를 유지하는 코드 안에 문자열을 사용하는 것은 here 문서를 사용하거나 문자열이 들어있는 텍스트 파일을 읽는 것만 가능합니다. 그러나 웹 페이지에서 html 폼을 사용하여 문자열을 삽입하고 CGI 모듈에서 escapeHTML()을 사용하면 모든 것을 처리하고 특수 문자의 가장 유선 조합을 삽입 할 수 있습니다. 그것들은 모두 정확하게 삽입되어 표시되고 보존됩니다. 그래서 직접 코드에서 문자열을 사용하여 먼저 일을 검사하는 대신 html 및 데이터베이스 작업을 직접 시작해야합니다. 어쨌든, 도와 줘서 고마워.