0

銘柄記号のリストを指定して、 Perl を使用しWWW::Mechanizeて Yahoo Finance から証券取引所を取得しています。

次のコードはファイルに書き込みます

#!/usr/bin/perl
# program name: FindStockExchange.pl

use strict;
use warnings;

use WWW::Mechanize;
use Storable;
use Getopt::Long;

#cmd: clear; ./FindStockExchange.pl  A AA AA.V AAA.TO -f ~/symbol_out.txt

# Find Stock Exchange for a given Stock Symbole
#  Command line options:
#    -s Symbol
#    -f Output filename

# Initialize variables:

my $urlBase   = 'http://finance.yahoo.com/q?s = ';    # Before symbol
my $urlSuffix = '&ql = 0';                            # After symbol
my $url       = '';
my $oFile     = '';
my $symbol    = '';
my $c         = '';

# Read command line options.
GetOptions(
  'f=s' => \$oFile                                    #Output filename
) or die "Incorrect usage!\n";

# Ouptput file(s)
open(OUTSYM, ">$oFile") || die "Couldn't open file $oFile, $!";

my $m = WWW::Mechanize->new(autocheck => 0);

foreach $symbol (@ARGV) {

  $url = $urlBase . $symbol . $urlSuffix;

  $m->get($url);
  $c = $m->content;    # Places html page source text into variable

  # Text pattern: <div class="title"><h2>Electrolux AB (ELUXY)</h2> <span class="rtq_exch"><span class="rtq_dash">-</span>OTC Markets  </span></div>

  $c =~ m{rtq_dash\">-</span>(.*?)</span>}s or next;

  print OUTSYM "$symbol\t$1\n";    # Write output file
  print "$symbol\t$1\t" . "\n";    # Write to STDOUT
}

close OUTFIL;

次のコードは、入力ファイルから読み取り、空のデータ ファイルを作成します。入力ファイルには、次の銘柄記号が含まれていました。

A
AA
AA.V
AAA.TO

 

#!/usr/bin/perl
# program name: FindStockExchange2.pl

use strict;
use warnings;

use WWW::Mechanize;
use Storable;
use Getopt::Long;

#cmd: clear; ./FindStockExchange2.pl -i ~/symbol_in.txt -o ~/symbol_out2.txt

# Find Stock Exchange for a given Stock Symbole
#  Command line options:
#    -i Input filename
#    -o Output filename

# Initialize variables:
my $urlBase   = 'http://finance.yahoo.com/q?s=';    # Before symbol
my $urlSuffix = '&ql=0';                            # After symbol
my $url       = '';
my $oFile     = '';
my $iFile     = '';
my $symbol    = '';
my $c         = '';

# Read command line options.
GetOptions(
  'o=s' => \$oFile,                                 #Output filename
  'i=s' => \$iFile                                  #Input filename
) or die "Incorrect usage!\n";

# File(s)
open(OUTSYM, ">$oFile") || die "Couldn't open file $oFile, $!";
open(INSYM,  "<$iFile") || die "Couldn't open file $iFile, $!";

my $m = WWW::Mechanize->new(autocheck => 0);

while (<INSYM>) {
  $symbol = chomp($_);
  $url    = $urlBase . $symbol . $urlSuffix;

  $m->get($url);
  $c = $m->content;    # Places html page source text into variable

# Text pattern: <div class="title"><h2>Electrolux AB (ELUXY)</h2> <span class="rtq_exch"><span class="rtq_dash">-</span>OTC Markets  </span></div>

  $c =~ m{rtq_dash\">-</span>(.*?)</span>}s or next;

  print OUTSYM "$symbol\t$1\n";    # Write output file
  print "$symbol\t$1\t" . "\n";    # Write to STDOUT
}

close INSYM;
close OUTSYM;

foreachループからループを使用した入力ファイルの読み取りに変更すると、while異なる結果が生じるのはなぜですか?

foreachコードは、以下を含むファイルを作成します。

A   NYSE  
AA  NYSE  
AA.V    TSXV  
AAA.TO  Toronto  
To-Air-Is:~ vlis

しかし、whileループは空のファイルを作成します。

4

1 に答える 1

2

ここで 2 つの問題:

1)chomp削除された文字数を返します。しかし、あなたは$symbolの結果に設定していますchomp。次のようになります。

chomp;
$symbol = $_;

@Vin のコメントに対する説明

これを行うこともできます:

$symbol = $_;
chomp($symbol);

ただし、これを行うべきではありません:

$symbol = chomp($_);

から改行chomp($_) $_削除しますが、削除された文字数を返します。

2) 入力ファイル内の 1 行に記号を配置する場合、$symbol は複数の記号の文字列になる可能性があります。したがって、おそらくそれらを分割するか、すべてのシンボルを独自の行に配置する必要があります

于 2013-09-15T05:26:08.123 に答える