나는 Perl에서 이 솔루션이 흥미롭다고 생각했습니다. 두 번째 파일에서 일치하는 열과 두 개의 추가 열(개정 ID n 릴리스 날짜)을 인쇄하려는 비슷한 상황이 있습니다. 이 코드에서 이 두 파일을 어떻게 읽을 수 있습니까? 나는 이 코드를 분석하고 해시와 배열에 대해 배울 계획입니다.
#!/usr/bin/perl
# create names lookup table from first file
my %names;
while (<>) {
(my $col1)= split / /, $_;
$names{$col1} = 1;
last if eof;
}
# scan second file
while (<>) {
print if /^(\S+).*/ && not $names{$1};
}
File 1:
Name IRR ID
slic73p1hsicbxttop 99034438
c73p1avrsrldo150top99034238
c73p1avrfusevrmtop 99034201
Example file 2
Type Name Rev ID IRR ID PP Group Date Released PP Category
Comp c73p1avrfusevrmtop PROD_2_5 99034201 SEG RIP Reuse 5/3/2015 6:59 Hard
Comp c73p1avrfusevrmtop PROD_2_4 99034201 SEG RIP Reuse 4/23/2015 10:27 Hard
Comp c73p1avrfusevrmtop PROD_2_3 99034201 SEG RIP Reuse 3/17/2015 23:51 Hard
Comp c73p1avrfusevrmtop PROD_2_2 99034201 SEG RIP Reuse 2/1/2015 11:27 Hard
Expected Output: there are also other rows in the table which doesn't match
IRR ID Rev ID Date Released (date to be printed in a chronological order)
99034201 PROD_2_5 5/3/2015 6:59
99034201 PROD_2_4 4/23/2015 10:27
99034201 PROD_2_3 3/17/2015 23:51
99034201 PROD_2_2 2/1/2015 11:27
답변1
첫 번째 블록:
my %names;
while (<>) {
( my $col1 ) = split / /, $_;
$names{$col1} = 1;
last if eof;
}
- 우리는 해시를 선언합니다
names
. - 한 번에 한 줄씩 파일 핸들을 반복합니다. 이 파일 핸들은
<>
Perl에서 특별한 의미를 갖습니다.누구나STDIN
또는 명령줄에 지정된 파일의 내용입니다. 이 코드는 후자의 경우에만 작동하는 것으로 보이며 이는 일반적으로 잘못된 형식입니다. - 각 루프 반복에서
$_
현재 행으로 설정됩니다. $_
공백 에split
배열로 변환합니다.my ( $col1 )
는 배열입니다. 분할의 첫 번째 요소가 에 할당됩니다$col1
. (나머지는 할당을 사용할 수 있습니다my ( $col1, $col2, @more_cols ) = ...
)$col1
해시의 키는names
1로 설정됩니다.
예를 들어:
$VAR1 = {
'c73p1avrsrldo150top' => 1,
'c73p1avrfusevrmtop' => 1,
'slic73p1hsicbxttop' => 1
};
그런 다음 두 번째 파일부터 시작합니다.
while (<>) {
print if /^(\S+).*/ && not $names{$1};
}
줄의 첫 번째 단어($1로 이동)를 "그냥" 캡처하는 잘못된 정규식으로 시작합니다. 그리고 만약에$names{$1}
아니요일단 설정되면 라인이 인쇄됩니다.
Comp
입력 데이터가 주어지면 이것은 단순히 작동하지 않습니다. 존재하는지 확인하고 names
있지 않기 때문입니다.