プロが教えるわが家の防犯対策術!

Perl メール送信にて

禁止語句を設定できるようにしました。
下記コードです。
my @ngword = ("禁止語句");
if(&ban($Name, \@ngword)) {
&error
}
sub ban
{
my $body = shift;
my $word = shift;
$body =~ s/(\x0d\x0a|\x0a|\x0d|\n|\s|\x81\x41|\xff)//g;
return map { $body =~ /$_/m } @$word;
}

実際これでブロックはしてくれるのですが、
my @ngword = ("禁止語句");
この部分をメモ帳(texteditor)から読み込む方法ってないでしょうか?

あれば教えて頂きたいです・・・

A 回答 (7件)

すみません, #2 には私が勘違いしていた部分があって, そのままではまず間違いなくうまくいかないはずです. ごめんなさい.



our の仕様を勘違いしてました.
{
open my $fh, '<', 'bannedwords.txt';
chomp(our @ngword = <$fh>);
}
とすると, この @ngword を外で使おうとするとそれなりになんかしないとダメでした. とりあえずこの部分 (4行) を
my @ngword;
{
open my $fh, '<', 'bannedwords.txt';
chomp(@ngword = <$fh>);
}
の 5行で置き換えれば @ngword のスコープの問題は解消できるはずです... が....

ただ, 本当にこれが問題だとするとなんか動作が変な気もします. とはいえ今わかっている情報からは (文字コードとかファイル名とかを除けば) これくらいしかおかしなところがないような気もするので, とりあえずこれでどうでしょうか. あ, 動かす前に構文チェックくらいはしてもらえるとありがたいところ.
    • good
    • 0
この回答へのお礼

すみません・・・
ありがとうございます。

構文チェックというのが、 Perl -c スクリプト名.pl
でなら「syntax OK」と表示されました。

文字コードは、Perlファイル→「日本語シフトJIS」
       テキストファイル→「ANSI」
この辺は、初期値で保存してます。

また、「print \@ngword;」を適当な行にたし、どのように返ってくるのか試したら「ARRAY(0x13725a4)」と表示されました。
ただ「0x」から後ろはランダムです・・・

お礼日時:2016/12/15 10:05

「errorと返らなかったのです・・・」とだけ言われてもねぇ.



・では実際どうなったのか
とか
・各種の変数の中身はどうであったのか
とか
・ファイル名は正しいのか
など, あなたの調べること (あなたにしかわからないこと) はもっとたくさんあるよね. それらをなぜ隠そうとするのですか?
    • good
    • 0
この回答へのお礼

実際どうなったのか
>初期のコードで、No2でご掲示くださったコードにかえ実行すると
コマンドラインはなにも起こらないです。
'bannedwords.txt' これの中身は 禁止語句 としかいれておりません。

各種の変数の中身はどうであったのか
>$変数には 禁止語句 @変数にも 禁止語句
としかいれておりません。

ファイル名は正しいのか
>確認しました。

とりあえずの練習でしたので、まだこれ以上は、なにもできていないので隠すことはないのですが・・・;;

my @ngword = &ng;

sub ng
{
"禁止語句";
}

テキストではないですが、サブで試したりはしましたが・・

お礼日時:2016/12/14 16:08

「上手くいかなかったです」っていわれても, なにがどう「上手くいかなかった」のかさっぱりわからんのよ.



さらにいえば, なにをどう考えてそう書き換えるにいたったのかまったく理解できない.
    • good
    • 0
この回答へのお礼

初回質問時のコードで
my $Name ="禁止語句";

my @ngword = ("禁止語句");
if(&ban($Name, \@ngword)) {
print "error";
}
sub ban
{
my $body = shift;
my $word = shift;
$body =~ s/(\x0d\x0a|\x0a|\x0d|\n|\s|\x81\x41|\xff)//g;
return map { $body =~ /$_/m } @$word;
}

これの
my @ngword = ("禁止語句");

{
open my $fh, '<', 'bannedwords.txt';
chomp(our @ngword = <$fh>);
}

と変えたのですが、
errorと返らなかったのです・・・

お礼日時:2016/12/13 10:16

そのようなことなら既に #2 に書いたんだけど. なにが問題になってるんだろう?

    • good
    • 0
この回答へのお礼

2でご掲示くださったコードの使い方

my $Name = "禁止語句";
{
open my $fh, '<', 'bannedwords.txt';
chomp(our @ngword = <$fh>);
}
if($Name, $fh) {
print "error\n";
}

というふうにさせてもらい
テキストには"禁止語句"としてはみたのですが・・・

上手くいかなかったです;;

お礼日時:2016/12/12 10:31

ごめん, なにをしようとしているのかさっぱりわかんないや.



「\@ngwordこれは、どういう記述になるのですか・・・?」とか「$fhと試してみたのですがorz」とかがなにをいわんとしているのかがわかんない. どういうことをしたいの?
    • good
    • 0
この回答へのお礼

説明がおかしいですね・・・

1から説明させていただきます。

my $Name = "あ";
my @ngword = &ng;
if(&ban($Name, \@ngword)) {
print "error\n";
print @ngword;
}
sub ban
{
my $body = shift;
my $word = shift;
$body =~ s/(\x0d\x0a|\x0a|\x0d|\n|\s|\x81\x41|\xff)//g;
return map { $body =~ /$_/m } @$word;
}
sub ng
{
"あ","禁止" ,"い","語句"
}

このようなコードを組んでおります。
(初期の質問と違うのは、自分なりに試した結果、現在ここまでできたため)

そこでNameは実際Paramから受け取るのですが仮に「あ」とします。
その「あ」が禁止ワードだった場合、「sub ng」に「”あ”」が設定されているためerrorを返すのですが、

このコード内で「sub ng」を「my @ngword = &ng;」の
「@ngword」に代入しているのですが、
「sub ng」からではなく、「ng.txt」(仮)から「@ngword」に代入させたいと考えていたのですが、そのやり方がわからなく質問させていただきました。

※第三者でも禁止ワードを設定できるようにしたいため
(Perlを使用しているのが、私のみだからです)

お礼日時:2016/12/10 10:34

えぇと.... ひょっとして, 通常では「テキストファイル」と呼ばれるもののことを指している?



もしそうなら例えば (エラー処理は無視して)
my @ngword = ("禁止語句");
の代わりに
{
open my $fh, '<', 'bannedwords.txt';
chomp(our @ngword = <$fh>);
}
のような感じかな.
    • good
    • 0
この回答へのお礼

>通常では「テキストファイル」と呼ばれるもののことを指している?
そうです;;

>{
open my $fh, '<', 'bannedwords.txt';
chomp(our @ngword = <$fh>);
}

ご掲示くださりありがとうございます。

使い方がいろいろ試したみたのですが、
前回の
if(&ban($Name, \@ngword)) {
&error
}

\@ngwordこれは、どういう記述になるのですか・・・?
また、違う書き方になるのでしょうか?

$fhと試してみたのですがorz

お礼日時:2016/12/09 07:38

「メモ帳(texteditor)から読み込む」とはどういうことでしょうか?



そのプログラムが動いているときに, たまたま何か書こうとしていた「メモ帳(texteditor)」から読み込む, ということでしょうか? だとすると, 「メモ帳(texteditor)」が動いてないときにはどのような動作をすればいいのでしょうか?
    • good
    • 0
この回答へのお礼

コメントありがとうございます。
プログラムが動く時はメモ帳(仮に名前を、「禁止マスタ」)
は、動いていないはずです・・・

例えば
my @ngword = ("あ","い","う");
としたとき「あ」「い」「う」の文字が禁止語句で

禁止マスタで
1行目|あ
2行目|い
3行目|う
というふうにして
プログラムが動いたときにメモ帳の
1行目から最終行の文字が含まれていないか
チェックして含まれていればerrorに飛ぶ

説明がわかりずらいかもしれませんが、
簡単に言えば@ngword のリストのマスタがほしいということです。

できれば
禁止語句に関しては、第3者も触れるようにしておきたいため、メモ帳
という選択をしました。。。

お礼日時:2016/12/08 16:36

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