perl oneliner에서 match expression을 파일에서 읽어오기

qiiiiiiiip의 이미지


펄을 아래와 같이 실행시킬때,
매치 패턴을 파일로 부터 읽어오는 방법이 있을까요?
( sed의 -f 옵션처럼 )

perl -pe 's/foo/bar/' file
perl -pe 's/abc/ABC/' file

을 하고 싶으면

script file에

s/foo/bar
s/abc/ABC

등을 모아서 적어두고,

perl --from-file scriptfile file

이런식으로 실행하는것이 가능할까요?

익명 사용자의 이미지

pattern.cfg

foo bar
abc ABC

replace.pl

#!/usr/bin/env perl
use strict;
use warnings;
 
my @patterns;
open my $fh, '<', 'pattern.cfg';
while (my $pattern = <$fh>) {
    chomp $pattern;
    my ($from, $to) = split ' ', $pattern;
    push @patterns, { from => $from, to => $to };
}
 
 
while(my $line = <DATA>) {
    chomp $line;
    foreach my $pattern (@patterns) {
        my ($from, $to) = ($pattern->{from}, $pattern->{to});
        $line =~ s/$from/$to/;
    }
    print "$line\n";
}
 
__DATA__
abcdef
foobar
qiiiiiiiip의 이미지


별도로 스크립트를 만드는것 말고
perl자체에서 native하게 지원하는 방법은 없을까요?

--

그리고 추가로, 's/from/to/flag' 에서
python reg exp의 re.UNICODE 옵션에 대응하는 flag가 있는지요?

익명 사용자의 이미지

>별도로 스크립트를 만드는것 말고
>perl자체에서 native하게 지원하는 방법은 없을까요?

sed 의 -f 옵션같은걸 말하신다면 없습니다.
http://www.nntp.perl.org/group/perl.beginners/2008/09/msg103320.html 에 누가 비슷한 질문을 올렸네요.

>그리고 추가로, 's/from/to/flag' 에서
>python reg exp의 re.UNICODE 옵션에 대응하는 flag가 있는지요?

Perl에서는 Perl내부 유니코드 인코딩으로 저장된 문자라면 별도의 UNICODE옵션 같은게
필요없이 문자열처리 및 정규식에서 기본으로 유니코드로 처리됩니다.
http://cafe.naver.com/perlstudy/697
http://cafe.naver.com/perlstudy/698
http://cafe.naver.com/perlstudy/699

Perl 스크립트언어와 기타 언어들을 다 포함해서 유니코드 지원이 가장 완벽한 언어입니다.
* Unicode Support Shootout The Good, the Bad, & the (mostly) Ugly
http://98.245.80.27/tcpc/OSCON2011/gbu.pdf

qiiiiiiiip의 이미지

알려주신 링크가 큰 도움이 되었습니다.
정확히 그것과 똑같은 일을 하고 싶었는데요..
while ( <> ){
s,from1/to1/flag1;
s,from2/to2/flag2;
print
}

라고 scriptfile을 쓰고 perl scriptfile input.txt 라고 실행하면 되겠네요..

그런데 re.UNICODE옵션도 그냥 u로 하니까 잘되네요...
( 참고로 re.UNICODE옵션은 인코딩옵션은 아니고,
한글등으 unicode character를 \w ( alphanumeric char. )에 포함시킬지
말지의 flag입니다.. )

--

그런데 아래 라인의 의미는 무엇인가요? 꼭 필요한 라인인가요?
use warnings;
use strict;

$^I = '';

익명 사용자의 이미지

$^I Value of the -i (inplace edit) switch.
의 의미입니다.
커멘드라인에서 -i 옵션을 준 효과를 내기 위함이죠.
따로 백업을 남길려면
$^I = '.bak';
처럼 하면 될 것 같네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.