dポイントプレゼントキャンペーン実施中!

下記のperlでgrepの戻り値がおかしい。
use Encode;
use utf8;
use open IO => ":encoding(utf8)";
binmode STDOUT,':encoding(cp932)';
binmode STDERR,':encoding(cp932)';
use LWP::Simple;

$content=get("http://uwakich.com/archives/49502116.html");
@list1=grep /\n/,$content;

@list2=grep{$list1[$_] =~ /html/} 0 .. $#list1;
print @list2;

grepの値は、添字を返す。結果は0を返す。実際は、最低でも2つは有る
はずだが。一つも無いと言うのは、どうしてだろうか。

これは、例えば一旦$contentをファイルに落としてからやると、今度は
きちんとgrepは添字を返して来る。

何が違うのだろうか。済みません。誤りを指摘願います。

質問者からの補足コメント

  • うーん・・・

    先程は失礼しました。実は、ファイルに落としてからやったのですが。
    矢張り出来ませんでした。ファイルに落としてからやると全ての
    htmlのソースを出力してから最後に0を出力します。

    意味が分かりません。この時のふるまいをすみませんが。説明願います。
    よろしくお願いします。

      補足日時:2017/02/18 16:59
  • うーん・・・

    下記のperlは正常に出力をするのですが。
    @in=( "htm", "html", "anta");
    @list=grep{$in[$_] =~ /html/} 0 .. $#in;
    print join("\t",@list);

    このブ場合は正しく1を表示します。
    何処が違うのだろうか。

      補足日時:2017/02/18 17:02

A 回答 (1件)

ちゃんと「添字 0 」という「正しい結果」が返ってきてますよ。



@list1=grep /\n/,$content;
 は、「要素が $content だけのリスト」が引数となります。つまり
my @contents
$contents[0] = $content ;
@list1=grep /\n/, @contents;
 と同等です。

 grepは /\n/ が真となる要素のリストをかえします。したがって
@;ist1 = @contents ;
 すなわち
$;ist1[0] = $content ;
 と同じ状態になります。

 その該当する添字の返えせば
@list2 = ( 0 )
 になるのが正しい動作です。


> 例えば一旦$contentをファイルに落としてからやると

こちらは、
@lines = <FP> ;
みたいな感じで、 ファイルの1行 = リストの1要素 として読み込んでいるのではないですか?

「行分割されたリスト」
と、
「全行を連結した文字列」
とで、結果が違ってもなんの不思議もありません。


@list1=grep /\n/,$content;
はsplitでしょうね。

http://perldoc.jp/func/grep
http://perldoc.jp/func/split
    • good
    • 0
この回答へのお礼

有難う御座います。

てっきり、grepをsplitの積りで使っていました。
解決です。vim,perl,enc,fencとかで、ごちゃごちゃして
整理が出来ていませんでした。

有難う御座います。

お礼日時:2017/02/18 17:12

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