본문 바로가기
창고/Backup_2013_0121

Day2 - 01

by 가능성1g 2011. 6. 16.
반응형


Day2 리스트
• 조건문과 반복문
• 서브루틴 ( 함수 )
• Named parameter passing
• Regular expressions

*. false 값
"" # false (” would also be false)
"0" # false
$new_variable # false (if we haven’t set it to anything, it’s undefined)
42 # true
0 # false
"00" # true, only a single zero is considered false
"wibble" # true

-> undefined ( == null ) 이거나 "", "0" 만 false 고 나머지는 다 true

*. if 구조
if (conditional statement) {
BLOCK
}
elsif (conditional statement) {
BLOCK
}
else {
BLOCK
}

-> if elif else 구조라는것을 익히자 ( elif 가 c랑 다른 점 )

*. unless
다음 두개는 같다
# make sure we have apples  
if( not $I_have_apples )    
{
    go_buy_apples();            
}                           

# make sure we have apples
unless( $I_have_apples )
{
    go_buy_apples();
}

*. 비교 연산자
C 와 거의 동일
특이한 비교 연산자 하나
<=> $a <=> $b Star-ship operator, see below

$a, $b 값을 ascii 로 비교 하여 -1, 0, 1  로 값을 반환
strcmp 와 비슷하게 수행하는듯 함

-. 쉘스크립트 비교연산자들도 사용가능

eq $a eq $b Equality
ne $a ne $b Inequality
lt $a lt $b Less than (in "asciibetical" order
gt $a gt $b Greater than
le $a le $b Less than or equal to
ge $a ge $b Greater than or equal to
cmp $a cmp $b String equivalent of <=>

-. 비교 예제
69 > 42; # true
"0" == 3 - 3; # true
’apple’ gt ’banana’; # false - apple is asciibetically before
# banana
1 + 2 == "3com"; # true - 3com is evaluated in numeric
# context because we used == not eq [**]
0 == "fred"; # true - fred in a numeric context is 0 [**]
0 eq "fred"; # false
0 eq 00; # true - both are "0" in string context.
0 eq "00"; # false - string comparison. "0" and
# "00" are different strings.
undef; # false - undefined is always false.

-. boolean 연산
&&, and
|| , or
!, not
둘다 사용가능

*. 반복문
-. while, until
# Count from 1 to 10
my $count = 1;
while ($count <= 10) {
print "$count\n";
$count++;
}

# Count down from 10 to 1
my $count = 10;
until ($count < 1) {
print "$count\n";
$count--;
}

-.for, foreach
# using a for loop
for (my $i = 0; $i < @array; $i++) {
print $array[$i] . "\n";
}
# using foreach
foreach my $value (@array) {
print "$value\n";
}
foreach (@array) {
print "$_\n";
}

-. 숫자 맞추기 게임 ( 연습문제 )
==> 오늘 배운걸 바탕으로 1~100 까지 숫자를 랜덤으로 생성해 맞추는 간단한 게임을 제작합니다~

## guess_number.pl
#!/usr/bin/perl
use warnings;
use strict;

my $guess_number = int(rand()*100); #답

print "숫자맞추기\n";
print "1..100 사이 숫자를 맞춰보세요\n";

my $input_data = 0;

until( $input_data eq $guess_number )
{
    $input_data = <STDIN>;

    chomp($input_data);

    if( $input_data gt $guess_number )
    {
        print "숫자가 큽니다\n";
    }
    elsif( $input_data lt $guess_number )
    {
        print "숫자가 작습니다\n";
    }
}

print "정답\n";


**. 서브루틴 ( 함수 )

-. 선언 및 사용법
sub print_headers {
print "Programming Perl, 2nd ed\n";
print "by\n";
print "Larry Wall et al.\n";
return;
}

print_headers(); # The preferred method.
&print_headers(); # Sometimes necessary.

&는 펄의 내부함수와 이름이 겹칠때 사용할 수 있다.
하지만 이름을 겹치게 안짓는게 더 낫다

-. 인수 전달
my $fiction_title = "Lord of the Rings";
my $fiction_author = "J.R.R. Tolkein";
print_headers($fiction_title, $fiction_author);
sub print_headers {
my ($title, $author) = @_;
print "$title\n";
print "by\n";
print "$author\n";
return;
}

-. 배열과 해쉬 전달
print_headers($title, $author, @publication_dates);
sub print_headers {
my ($title, $author, @dates) = @_;
print "$title\nby\n$author\n";
if(@dates) { # If we were given any publication dates
print "Printed on: @dates";
}
return;
}
-> 하나의 배열을 넘기는 것은 상관없다..

# Flatten two lists into one big list and put that in an array
my @biglist = (@list1, @list2);
# Flatten (join) two hashes into one big list an put that in a hash
my %bighash = (%hash1, %hash2);
# Make a nonsense list and put that in an array:
my @nonsense = (%bighash, @list1, @biglist, 1 .. 4);
Thus if we write the following code, we won’t get the results we want:
my @colours = qw/red blue white green pink/;
my @chosen = qw/red white green/;
two_lists(@chosen, @colours);
sub two_lists {
my (@chosen, @colours) = @_;
# at this point @chosen contains:
# (red white green red blue white green pink)
# and @colours contains () - the empty list.
...
return;
}
-> 두개 이상의 배열을 넘기면 위와 같이 두번째 인수는 비어 버리게 된다..

예제 하나더~

이렇게 찍어보면..
#!/usr/bin/perl
use warnings;
use strict;

my @colours = qw/red blue white green pink/;
my @chosen = qw/red white green/;

two_list(@colours, @chosen);

sub two_list
{
    my (@chosen, @colours) = @_;
    print "@chosen \n";
    print "@colours \n";
}

red blue white green pink red white green 
 
이렇게 나와 버린다.

이를 해결하는 방법은 ~
two_lists(\@chosen, \@colours);
sub two_lists {
my ($chosen, $colours) = @_;
my @chosen_copy = @$chosen;
my @colours_copy = @$colours;
# at this point @chosen_copy contains: (red white green)
# and @colours_copy contains (red blue white green pink)
...
return;
}

하면되는데 ~ 이는 뒤에 다시 배운다~

-. 리턴값
sub format_headers {
my ($title, $author) = @_;
return "$title\nby\n$author\n\n";
}
sub sum {
my $total = 0;
foreach (@_) {
$total = $total + $_;
}
return $total;
}
-> C 와 동일하게 사용가능

-. 리턴값이 리스트일때 요렇게도 받을 수 있음
# subroutine to return some random integers between 0 and $max
sub random_ints {
my ($how_many, $max) = @_;
my @randoms;
foreach (1..$how_many) {
push @randoms, int(rand $max);
}
return @randoms;
}
my @three_rands = random_ints(3, 10);
# sets @three_rands to something like: (4, 7, 1);
# alternately:
my ($w, $x, $y, $z) = random_ints(4, 15); # eg: $w=0, $x=3, $y=13, $z=2




반응형