アプリ版:「スタンプのみでお礼する」機能のリリースについて

@UserDataNum=qw(11 13 34)
@PDataLinesの中身
1<>タイトル<>2009/02/10<>適当なデータ<>適当なデータ2<>
2<>タイトル2<>2009/03/13<>適当なデータ<>適当なデータ2<>
..
50<>タイトル3<>2009/03/23<>適当なデータ<>適当なデータ2<>
$TODAY=今日の時間;
foreach(0..$#PDataLines){
my@aaa= split(/<>/,$PDataLines[$_]);
my$a2 = $aaa[2];$a2 =~s{/}{}g;
#ここの処理で@UserDataNumに入っている数字と一致する$aaa[0]を含む行を除外し、時間が今日以降のものを配列@Arrayに入れたいのです
if(($aaa[0] !~ /@UserDataNum/) && ( $TODAY < $a2)){
push(@Array,$PDataLines[$_]);
}
}
print "\@Array=@Array";
if(grep(!/@UserDataNum/, @PDataLines) && ( $TODAY2 < $a2)){
としてみたり試みているのですが、思うように出来ずにいます。

どなた様かご教授願えませんでしょうか

宜しくお願い致します。

A 回答 (2件)

/@UserDataNum/


が何を意味するか確認しましたか?
実はどこか適切なところで
local $"='|';
を実行すれば終わりだったりして.
    • good
    • 0
この回答へのお礼

ご教授頂きありがとうございます。

local $"='|';
@PS = grep(!/^(@UserDataNum)/, @PDataLines);
local $"='<br>';
print "\@PS=@PS<br>";

とする事で思い通りの結果と確認が出来ました。

/配列/を展開する際、/(a|b|c)/のようなケースの場合に使えるんですね。
local $"='|';の使い方がわかり参考になりました。

ただ、
@PS = grep(!/^(@UserDataNum)/, @PDataLines);
とした場合、行の最初から指定かつ最長一致のルールで問題なさそうなのですが、思わぬ行にマッチしそうで今回は見送りにしましたが、
とても参考になるアドバイスありがとうございました。

お礼日時:2009/03/06 20:23

$aaa[0] =~ /@UserDataNum/ は展開すると


$aaa[0] =~ /11 13 34/
となるので整数にマッチすることがないのが問題です。
この部分を grep で書き直してみたのが下記です。

if( not( grep {$aaa[0] == $_ } @UserDataNum ) && ( $TODAY < $a2)){

これで望みの動作になるのではないでしょうか。

参考URL:http://perldoc.jp/docs/perl/5.10.0/perlfunc.pod# …
    • good
    • 0
この回答へのお礼

ご教授頂きありがとうございます。

まさしく一発で思い通りの結果を得る事が出来ました。


普段、not(grep{$ハッシュ == $_} 配列)の記述には慣れていない為
私は下記のように
unless(grep(/$aaa[0]/,@UserDataNum)){
if($TODAY2 < $a2){
push(@PS,$PDataLines[$_]);
}
}

考えていたのですが
見事1行でマッチさせる記述をご教授頂きありがとうございます。

お礼日時:2009/03/06 20:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!