4

配列への参照の次の配列があります:

my @holidays = [[2012,'01','02'],[2012,'01','16'],[2012,'02','20'],[2012,'04','16'],[2012,'05','28'],[2012,'07','04'],[2012,'09','03'],[2012,'10','08'],[2012,'11','12'],[2012,'11','22'],[2012,'12','25']];

これは、2012年にIRSが認めた法定休日です。配列@dueDateをその配列の値と照合し、1が返されるか、存在する場合はtrueを返します。

    while ($holidays[@dueDate]){
        print ("Found Holiday \t join('-',@dueDate)");
        @dueDate = Add_Delta_Days(@dueDate, 1);
        if ( Day_of_Week(@dueDate) > 5){
            @dueDate = Monday_of_Week((Week_Number(@dueDate)+1), $dueDate[0]);
        }
    }

私の現在の試みはこれです-whileステートメントの条件は決して真ではありません。休日の参照と逆参照のいくつかの異なる組み合わせを試しましたが、役に立ちませんでした。

@dueDateに上記の配列内の日付が含まれている場合にブロックが実行されるように、whileステートメント内の評価を操作するのが最善の方法は何でしょうか。

注:@dueDateはDate :: Calc標準配列です-(年、月、日)

4

4 に答える 4

3

これはあなたを正しい軌道に乗せるはずです。私があなたのコードで見た2つの問題-配列の配列は外側の部分に通常の括弧があり、~~演算子を使用して配列が等しいかどうかを比較する必要があります。

my @holidays = ([2012,'01','02'],[2012,'01','16'],[2012,'02','20'],[2012,'04','16'],  
[2012,'05','28'],[2012,'07','04'],[2012,'09','03'],[2012,'10','08'],[2012,'11','12'], 
[2012,'11','22'],[2012,'12','25']);
my $i;
my @duedate = [2012, '01', '02'];

for ($i = 0; $i < @holidays; $i++)
{
    if (@holidays[$i] ~~ @duedate)
    {
        print "matched!!";
    }
}
于 2012-06-12T21:18:34.193 に答える
2

初め、

my @holidays = [[2012,'01','02'],...,[2012,'12','25']];

する必要があります

my @holidays = ([2012,'01','02'],...,[2012,'12','25']);

単一の要素で配列を作成しています。


おそらく、あなたが望むことを達成するための最良の方法は、ハッシュを使用することです。

my %holidays = map { join('-', @$_) => 1 } @holidays;

次に必要なのは

while ($holidays{join('-', @dueDate)}) {
   my $dow = Day_of_Week(@dueDate);
   @dueDate = Add_Delta_Days(@dueDate,
      $dow == 5 || $dow == 6 ? 8 - $dow : 1);
}
于 2012-06-12T21:17:58.860 に答える
2

これが私の答えです。Perl5.14で作業しています。また、smartmatching~~演算子を使用して2つの配列を比較しています。

配列に割り当てる@holidays=[[2012、'01'、' 02']、]; 正しくありません。実際には、匿名配列[['2012'、'01'、'02']、]を@holidaysの最初の要素に割り当てます。

use v5.14;

my @holidays = ( ['2012', '01', '02'], ['2012', '01', '16'] );
my @due_date = ( '2012', '01', '16' );

for my $holiday (@holidays) {

    if (@$holiday ~~ @due_date) {
        say "holiday match";
    }
}
于 2012-06-12T21:17:59.840 に答える
0

さて、いくつかのこと:

1:リストは括弧で囲まれ、リテラル配列参照は括弧で囲まれています。だから、あなたは持っている必要があります:

my @holidays = ([2012,'01','02'],[2012,'01','16'],[2012,'02','20'],[2012,'04','16'],[2012,'05','28'], [2012,'07','04'],[2012,'09','03'],[2012,'10','08'],[2012,'11','12'],[2012,'11','22'],[2012,'12','25']);

2:を見ると$holidays[@dueDate]、すべてをスカラーコンテキストで呼び出しています。特に、に@dueDateは3つの要素があるため、見ているのは。だけです$holidays[3]

3:使い捨てのコードを書いているのでない限り、常に use strict;そしてuse warnings;

だから、あなたはこのようなものが欲しいです:

use strict;
use warnings;

my @holidays = ([2012,'01','02'],[2012,'01','16'],[2012,'02','20'],[2012,'04','16'],[2012,'05','28'],
    [2012,'07','04'],[2012,'09','03'],[2012,'10','08'],[2012,'11','12'],[2012,'11','22'],[2012,'12','25']);

my @dueDates=([2012,'01','01'],[2012,'01','02'],[2012,'01','03']); #Or whatever

my @due_dates_that_are_holidays=();

foreach my $due_date(@dueDates)
{
  foreach my $holiday(@holidays)
  {
    my ($h_y,$h_m,$h_d)=@$holiday; #Capturing year month and day from the array reference
    my ($d_y,$d_m,$d_d)=@$due_date; #Ditto for the due date

    if($h_y == $d_y and $h_m eq $d_m and $h_d eq $d_d)
    {
      push @due_dates_that_are_holidays,$due_date;
    }
  }
}
print join("-",@{$_}) . "\n" foreach(@due_dates_that_are_holidays);

上記のコードは、次の出力を生成します。

2012-01-02
于 2012-06-12T21:23:25.450 に答える