perl sprintf 질문...
글쓴이: doodoo / 작성시간: 수, 2011/09/28 - 1:10오후
펄 함수형에 관한 글을 보고 있습니다.
원 문은 여기...
http://perl.jonallen.info/talks/functionalprogramming
아래 코드는 위 예문중 달력 만드는 프로그램인데...
#!/usr/bin/perl use strict; use warnings; use Time::Piece; use Time::Seconds; my $year = 2000; my $month = 2; sub day_iterator{ my $day = shift; return sub{ my $today = $day; $day += ONE_DAY; return $today; } } my $first_day = Time::Piece->strptime("$year-$month-01", "%Y-%m-%d"); my $every_day = day_iterator($first_day); my $days_in_month = iterate_while($every_day, sub { $_->mon == $month and $_->year == $year }); sub iterate_while { my ($iterator, $condition) = @_; return sub{ local $_; while (defined ($_ = $iterator->())) { return ($condition->()) ? $_ : undef; } } } sub cal_week_function { my $next_day = shift; my @week; return sub{ while(1){ my $day = $next_day->() or return splice @week; @week[$day->day_of_week] = $day->day_of_month; return splice @week if (@week == 7); } } } my $calendar_week = cal_week_function($days_in_month); print $first_day->fullmonth, " $year\n\n"; print join ' ', Time::Piece::day_list,"\n"; while ( my @week = $calendar_week->()) { print join ' ',map{ sprintf("%3s", $_ // '')} @week, "\n"; }
실행은 잘 돼지만....
에서 sprintf("%3s", $_ // '') 의 // 와 '' 의 뜻이 무엇인지 당췌 이해가 안가는군요.
아시는 분 계시나요?
Forums:
defined-or 연산자와 빈 문자열입니다.
http://perldoc.perl.org/perlop.html#C-style-Logical-Defined-Or
감사합니다. 세상에...or 연산자가 그렇게
감사합니다.
세상에...or 연산자가 그렇게 생겨먹었는지 첨 알았습니다.
In fact, it's exactly the
In fact, it's exactly the same as ||
|| 와 // 는 다릅니다.
|| 와 // 는 다릅니다.
my $a = 0;
my $var = $a || 'default';
my $var2 = $a // 'default';
에서 $var는 'default'가 되지만 $var2는 0 이 됩니다.
|| 연산자는 단순히 그 좌측이 Perl에서 거짓으로 평가되는 것
(정의되지(defined) 않은 것, 0, ''문자 등) 이면 그 오른쪽 값을 취합니다.
반면 //는 Perl 5.10부터 추가된 것으로 정의되지(defined) 않은 것만 거짓으로 평가하죠
$a // 'default; 는 풀어쓰면
defined $a ? $a : 'default'; 와 같습니다.
Python과 Ruby는 변수를 쓰는 순간 동시에 정의가 되지만 Perl에서는 use strict;를
이용해서 strict모드를 쓰면 모든 변수는 my, our ,local등의 키워드로
사용전에 변수의 스코프를 명확하게 지정해야 합니다.
뒤에 except that it tests the
뒤에
except that it tests the left hand side's definedness instead of its truth.
이건 왜 안 가져오시고;;;;;
좋은 하루 되세요!
댓글 달기