기본적으로 정규식과 일치하는 특정 파일이 특정 디렉터리에 있는지 확인하는 Perl 스크립트를 작성하려고합니다. 내 코드는 다음과 같습니다.
use strict;
use warnings;
system ("grep PATH $ENV{MODEL_ROOT}/<....>/paths.tcl > \$MODEL_ROOT/hip_paths.csv");
system("sed -i 's/) /,/g' \$MODEL_ROOT/paths.csv");
system("sed -i 's/set G_L.*,//g' \$MODEL_ROOT/paths.csv");
my @glob;
my $file = "$ENV{MODEL_ROOT}/paths.csv" or die "CSV File is not present\n";
open(my $file_data, '<', $file) or die "Could not open '$file' $!\n";
while (my @line = <$file_data>) {
system ("printf \"@line\" >> fields"); #For debug
foreach my $path (@line)
{
$path =~ m/^.*proj\/(.*)\/<blah>/; #To find 'name'
if (glob ("$path/*0p765v_125c*.ldb")) #Check if file exists in $path with said pattern
{
@glob = glob ("$path/*0p765v_125c*.ldb");
print "File exists for $1 in path $path: @glob\n"
}
else
{
print "Does not exist for $1 in path $path\n";
}
}
}
close $file_data
paths.csv 는 다음과 같습니다. (TM 및 C 문제로 인해 실제 경로를 게시 할 수 없음)
/(path-to-proj)/proj/name1/version1/abc
/(path-to-proj)/proj/name2/version2/abc
/(path-to-proj)/proj/name3/version3/abc
/(path-to-proj)/proj/name4/version4/abc
/(path-to-proj)/proj/name5/version5/abc
(proj 경로)는 영숫자,
proj 는 영숫자,
name <>은 영숫자이며 밑줄을 포함 할 수 있습니다.
version <>은 영숫자입니다.
이 모든 경로에 해당 패턴과 일치하는 파일이 있다는 것을 알고 있습니다. 그러나 내 코드의 결과는 다음과 같습니다.
File exists for name1 in path /(path-to-proj)/proj/name1/version1/abc
: /(path-to-proj)/proj/name1/version1/abc
Does not exist for name2 in path /(path-to-proj)/proj/name2/version2/abc
File exists for name3 in path /(path-to-proj)/proj/name3/version3/abc
: /(path-to-proj)/proj/name3/version3/abc
Does not exist for name4 in path /(path-to-proj)/proj/name4/version4/abc
결과는 '존재 함'과 '존재하지 않음'이 번갈아 나타납니다. 내가 도대체 뭘 잘못하고있는 겁니까?
연산자 (예 glob
:)는 스칼라 컨텍스트 또는 목록 컨텍스트에서 평가되는지 여부에 따라 다르게 작동합니다.
glob
스칼라 컨텍스트에서 반복자 역할을합니다. 반환 할 항목이 없음을 나타 내기 위해 undef를 반환 할 때까지 다음 일치 항목을 반환합니다. 논쟁이 바뀌더라도 상관 없습니다.
$ perl -e'for (1..7) { my $glob = glob("*"); CORE::say "$_ $glob"; }'
1 a.xml
2 b.xml
3
4 a.xml
5 b.xml
6
7 a.xml
당신은 그것을 원하지 않습니다. 목록 컨텍스트에서 호출하고 싶습니다. 그래서 교체
if (glob ("$path/*0p765v_125c*.ldb")) {
@glob = glob ("$path/*0p765v_125c*.ldb");
와
if ( my @ldb_paths = glob("$path/*0p765v_125c*.ldb") ) {
또는
if ( my ($ldb_path) = glob("$path/*0p765v_125c*.ldb") ) {
두 번째 옵션은 첫 번째 일치 만 가져 오며 나머지는 무시합니다. 할당의 왼쪽에있는 괄호는 오른쪽에 필요한 목록 컨텍스트를 만드는 데 중요합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다