2011-12-05 2 views
3

디렉토리에서 파일 목록을 가져 와서 각 파일을 열고 .zip 확장자를 가진 파일 이름이있는 행을 검색하는 스크립트를 작성하고 있습니다. 그런 다음 줄에서 파일 이름을 제거하려고합니다. 여기 내 코드입니다 :파일 이름 추출

foreach (@fnames) { 
    chomp ($_); 
    open FILE, '<', "$_"; 
    @archives = grep { /.+?\.zip/ } <FILE>; 

    foreach (@archives) { 
     if ($_ =~ /("|>)(.+?)("|<)/) { push @files, $2; } 
    } 
} 

내가 따옴표 또는 꺽쇠 괄호 중 하나를 사이에 한 .zip 파일 이름이 포함됩니다에서 데이터를 당기는 해요 파일. 이 코드는 아무 것도 반환하지 않지만 파일 이름이 있다는 것을 알고 있습니다. 터미널에서 grep을하면 모든 것을 볼 수 있지만 Perl의 grep은 아무 것도주지 않습니다. 어떤 아이디어?

+0

. 두 번째 루프 안에'@ archives'와'$ _'을 덤핑 해 보았습니다. – CanSpice

답변

6

가능한 일 :

  • @fnames 때문에 코드에서 일부 오류, 비어있는 당신은 표시되지 않습니다.
  • open FILE, ...은 실패하지만 open의 반환 값 을 확인하지 않았으므로 자동으로 실패하므로 사용자는 알 수 없습니다. open ... or die $!
  • 입력에 대문자가 있습니다. ZIP/i grep에서 대소 문자 무시 옵션을 사용하지 마십시오. Btw .zip으로 시작하는 원치 않는 문자열을 예상하지 않는 한 처음에는 의 Btw가 .+?입니다. 즉, 이전에 문자가 하나만 있는지 확인합니다.
  • 두 번째 루프 내부의 if 문은 첫 번째 일치를 가져옵니다. 또한

:

  • 당신은 open과 어휘 파일 핸들을 사용해야합니다.
  • 아직 작성하지 않은 경우 엄격한 경고를 사용해야합니다.
  • my @archivesmy @files을 올바른 어휘 범위로 사용하면 을 통해 원하는 데이터를 얻고 유지할 수 있습니다.
  • $_ =~ /.../은 더 읽기 쉽게 (IMO)로 쓸 수 있습니다. /.../
  • 전환 변수가 필요하지 않습니다.
  • ("|>)은 중복되는 방법으로 [">]입니다.
  • grep은 중복 처리입니다. 당신은 간단하게 수행 할 수 있습니다

while (<FILE>) { 
     push @files, /[">](.*\.zip)["<]/ig; 
} 

한마디로 : 그것은 조금 테스트 스크립트와 나를 위해 작동

my @files; 
foreach my $file (@fnames) { 
    chomp $file; 
    open my $fh, '<', $file or die $!; 
    while (<$fh>) { 
     push @files, /[">](.*\.zip)["<]/ig; 
    } 
} 
print "File names found: @files\n"; 
+0

잘 작동했습니다! 도와 주셔서 감사합니다. 나는 파일 핸들을 열었을 때 die를 포함하지 않은 autodie를 사용하고있었습니다. 나는 (위에서 언급 한) 문제는 @archives 배열이 채워지지 않았다고 생각한다. 나는 아직 모든 팁에 익숙하지 않기 때문에 정규 표현식을 배우고있다. 다시 한 번 감사드립니다! – stimko68

+0

@ stimko68 환영합니다! – TLP

0

스크립트에서 아무 것도 출력하지 않고 배열의 요소를 변경하는 중입니다. 너는 print 줄을 가져야하고, Tie::File을 사용하면 각 파일을 배열로 직접 액세스 할 수 있습니다. 잘못된