2017-12-04 11 views
-3

배열에 @atom이 있다고 가정 할 수 있습니다. 나는 그 배열에 $a, $b, $c (잔여 물 이름, 사슬 및 잔기 번호를 각각 pdb 파일에서 가져온) 세 가지 요소를 푸시합니다. 예를 들어, $b 값을 AAAAAAAAA, BBBBBBB, CCCCCCC있다. $b 변경 될 때마다 배열을 비우는 방법? $ A $ B 형 $의 C 가정배열의 값이 변할 때 배열을 비우는 방법?

배열은 다음과 같다,

push(@atom,"$a $b $c"); 
+6

질문이나 문제를 잘 모르겠습니다. [mcve]를 만들어보세요. "$ b changes"란 무엇을 의미합니까? – tinita

+4

'$ b'가 어떻게 변하는 지 어떻게 알 수 있습니까? /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 당신은 string_ ('$ a', 공백,'$ b', 공백,'$ c')의 배열을 배열에 푸시합니다. 세 요소를 푸시하려면'push (@atom, $ a, $ b, $ c);'(따옴표 제외)를 사용하십시오. – PerlDuck

+0

'@atom = qw (aa bb cc); @ atom = ""if ($ atom [1]! ~ m/dd/i); ' – ssr1012

답변

3

잘 모르겠어요 배열에 하나의 값만 저장하면됩니다. 세 개의 값을 저장한다고 생각하지만 배열에 저장하기 전에 단일 문자열로 저장합니다.

는이 같은 코드를 사용할 수 있습니다, 당신의 배열에 세 개의 값을 저장하려면.

my @atom = ($residue_name, $chain, $residue_number); 

(나는 또한 당신의 변수 이름을 변경 한 것을 알 $a, $b$c 변수와 $a와 끔찍한 이름입니다 $b은 Perl을위한 특수 변수이므로 임의의 코드에 사용해서는 안됩니다.)

여기서는 뭘하고 있는지 잘 모르겠지만이 데이터를 해시에 저장하는 것이 더 바람직하다고 생각됩니다 . 나는 당신이 당신의 데이터로 무엇을해야하는지 알 수 없기 때문에 물론

my %atom = (
    residue_name => $residue_name, 
    chain   => $chain, 
    residue_number => $residue_number, 
); 

, 그건 단지 추측 -하지만 프로그램의 중요한 부분은 데이터 구조를 잘 얻는 것입니다.

원래 배열을 계속 사용 중이며 a) $chain 변수가 값을 변경했는지 확인하고 b) 해당 지점에서 배열을 비 웁니다.

my @atom = ($residue_name, $chain, $residue_number); 
# Store the current value of $chain 
my $original_chain = $chain; 

그런 다음 나중에 값이 변경되었는지 확인하고 적절한 조치를 취해야합니다.

if ($chain ne $original_chain) { 
    @atom =(); 
} 

물론 이것은 모두 가장 단순한 제안 사항입니다. 귀하의 코드가 어떻게 구성되어 있는지 전혀 모르겠습니다.

1

루프에서 읽기 및 배열에 밀려 사용하는 이유

while (...) { 
    # read $a $b $c 

    if ($b ne $last_b) { 
     @atom =() # atom is affected to a new empty array 
    } 

    push @atom, ... 

    $last_b=$b 
}