File Coverage

blib/lib/Finance/YahooJPN/Sym2Name.pm
Criterion Covered Total %
statement 62 63 98.4
branch 8 10 80.0
condition 3 3 100.0
subroutine 11 11 100.0
pod 1 3 33.3
total 85 90 94.4


line stmt bran cond sub pod time code
1             package Finance::YahooJPN::Sym2Name;
2            
3 1     1   40883 use 5.008;
  1         4  
  1         48  
4 1     1   5 use strict;
  1         2  
  1         37  
5 1     1   5 use warnings;
  1         13  
  1         31  
6 1     1   5 use utf8;
  1         2  
  1         6  
7            
8             our $VERSION = '0.04'; # 2011-06-14 (since 2002-03-26)
9             our @ISA = qw(Exporter);
10             our @EXPORT = qw(sym2name);
11            
12 1     1   79 use Exporter;
  1         1  
  1         36  
13 1     1   4 use Carp;
  1         10  
  1         76  
14 1     1   851 use IO::Socket;
  1         29986  
  1         5  
15            
16             my $Server = 'stocks.finance.yahoo.co.jp';
17            
18             =head1 NAME
19            
20             Finance::YahooJPN::Sym2Name - converts a Japanese stock symbol to the name
21            
22             =head1 SYNOPSIS
23            
24             use Finance::YahooJPN::Sym2Name;
25            
26             # get the name of company of stock symbol code '6758'
27             my $stockname = sym2name('6758');
28            
29             print $stockname; # it prints 'SONY CORPORATION'
30            
31             =head1 DESCRIPTION
32            
33             This module converts a Japanese stock symbol code to the name of company. Japanese stock markets use 4-digit code number as stock symbol. You can get either English or Japanese name of company.
34            
35             =head1 FUNCTIONS
36            
37             =over
38            
39             =item sym2name($symbol [, $lang])
40            
41             This function returns a string of the name of company from C<$symbol> (a stock symbol code of 4-digit number).
42            
43             In case it were a missing code number, the module returns string '(n/a)';
44            
45             C<$lang> attribute specifies language mode of the company's name. A C<$lang> value is 'eng' (in English) or 'jpn' (in Japanese). This attribute is omittable and the default value is 'eng'.
46            
47             Note that string data under 'jpn' C<$lang> mode is encoded with UTF-8 character encoding.
48            
49             =cut
50            
51             sub sym2name ($;$) {
52 4     4 1 36 my($symbol, $lang) = @_;
53            
54 4 50       34 unless ($symbol =~ /^\d{4}$/) {
55 0         0 croak "stock symbol code must be specified with 4-digit code number";
56             }
57            
58 4         17 my $url = "http://stocks.finance.yahoo.co.jp/stocks/profile/?code=$symbol";
59 4         18 my @html = fetch($url);
60            
61             # in case it were a missing code number
62 4         109 foreach my $line (@html) {
63 2316 100       5160 if ($line =~ m/一致する銘柄は見つかりませんでした/) {
64 1         48 return '(n/a)';
65             }
66             }
67            
68 3         10 my %name;
69             # find and extract the name of company in Japanese
70 3         7 foreach my $line (@html) {
71 2118         6250 $line =~ m/(.+?)【$symbol】.*?<\/title>/; </td> </tr> <tr> <td class="h" > <a name="72">72</a> </td> <td class="c3" > 2118 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 13895 </td> <td class="s"> utf8::decode($name{'jpn'} = $1); </td> </tr> <tr> <td class="h" > <a name="73">73</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="74">74</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 30 </td> <td class="s"> $name{'jpn'} =~ s/\(株\)//; </td> </tr> <tr> <td class="h" > <a name="75">75</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 23 </td> <td class="s"> $name{'jpn'} =~ s/^\s*//; </td> </tr> <tr> <td class="h" > <a name="76">76</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 22 </td> <td class="s"> $name{'jpn'} =~ s/\s*$//; </td> </tr> <tr> <td class="h" > <a name="77">77</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="78">78</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> # find and extract the name of company in English </td> </tr> <tr> <td class="h" > <a name="79">79</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 22 </td> <td class="s"> for (my $i = 0; $i < @html; $i++) { </td> </tr> <tr> <td class="h" > <a name="80">80</a> </td> <td class="c3" > 1014 </td> <td class="c3" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--branch.html#80-1"> 100 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 3163 </td> <td class="s"> if ($html[$i] eq '<th nowrap>英文社名</th>') { </td> </tr> <tr> <td class="h" > <a name="81">81</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 175 </td> <td class="s"> $html[$i + 1] =~ m/<td colspan="3">(.+?)<\/td>/; </td> </tr> <tr> <td class="h" > <a name="82">82</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 15 </td> <td class="s"> $name{'eng'} = $1; </td> </tr> <tr> <td class="h" > <a name="83">83</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 17 </td> <td class="s"> $name{'eng'} = full2half($name{'eng'}); </td> </tr> <tr> <td class="h" > <a name="84">84</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 9 </td> <td class="s"> last; </td> </tr> <tr> <td class="h" > <a name="85">85</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="86">86</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="87">87</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="88">88</a> </td> <td class="c3" > 3 </td> <td class="c3" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--branch.html#88-1"> 100 </a> </td> <td class="c3" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--condition.html#88-1"> 100 </a> </td> <td >   </td> <td >   </td> <td > 30 </td> <td class="s"> if ($lang and lc($lang) eq 'jpn') { </td> </tr> <tr> <td class="h" > <a name="89">89</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 83 </td> <td class="s"> return $name{'jpn'}; </td> </tr> <tr> <td class="h" > <a name="90">90</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="91">91</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> else { </td> </tr> <tr> <td class="h" > <a name="92">92</a> </td> <td class="c3" > 2 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 157 </td> <td class="s"> return $name{'eng'}; </td> </tr> <tr> <td class="h" > <a name="93">93</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="94">94</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="95">95</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="96">96</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub fetch ($) { </td> </tr> <tr> <td class="h" > <a name="97">97</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--subroutine.html#97-1"> 4 </a> </td> <td class="c0" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--subroutine.html#97-1"> 0 </a> </td> <td > 11 </td> <td class="s"> my $abs_path = shift; </td> </tr> <tr> <td class="h" > <a name="98">98</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="99">99</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--branch.html#99-1"> 50 </a> </td> <td >   </td> <td >   </td> <td >   </td> <td > 62 </td> <td class="s"> my $sock = IO::Socket::INET->new( </td> </tr> <tr> <td class="h" > <a name="100">100</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> PeerAddr => $Server, </td> </tr> <tr> <td class="h" > <a name="101">101</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> PeerPort => 'http(80)', </td> </tr> <tr> <td class="h" > <a name="102">102</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Proto => 'tcp', </td> </tr> <tr> <td class="h" > <a name="103">103</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> ) or die "Couldn't connect to $Server"; </td> </tr> <tr> <td class="h" > <a name="104">104</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="105">105</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 1155015 </td> <td class="s"> print $sock <<"EOF"; </td> </tr> <tr> <td class="h" > <a name="106">106</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> GET $abs_path HTTP/1.1 </td> </tr> <tr> <td class="h" > <a name="107">107</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Host: $Server </td> </tr> <tr> <td class="h" > <a name="108">108</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="109">109</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> EOF </td> </tr> <tr> <td class="h" > <a name="110">110</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="111">111</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 203365992 </td> <td class="s"> chomp(my @html = <$sock>); </td> </tr> <tr> <td class="h" > <a name="112">112</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 865 </td> <td class="s"> close $sock; </td> </tr> <tr> <td class="h" > <a name="113">113</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="114">114</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 28 </td> <td class="s"> foreach my $line (@html) { </td> </tr> <tr> <td class="h" > <a name="115">115</a> </td> <td class="c3" > 2550 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 4931 </td> <td class="s"> utf8::decode($line); </td> </tr> <tr> <td class="h" > <a name="116">116</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="117">117</a> </td> <td class="c3" > 4 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 713 </td> <td class="s"> return @html; </td> </tr> <tr> <td class="h" > <a name="118">118</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="119">119</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="120">120</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub full2half ($) { </td> </tr> <tr> <td class="h" > <a name="121">121</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--subroutine.html#121-1"> 3 </a> </td> <td class="c0" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--subroutine.html#121-1"> 0 </a> </td> <td > 7 </td> <td class="s"> my $string = shift; </td> </tr> <tr> <td class="h" > <a name="122">122</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="123">123</a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td class="c3" > <a href="blib-lib-Finance-YahooJPN-Sym2Name-pm--subroutine.html#123-1"> 1 </a> </td> <td >   </td> <td > 1476 </td> <td class="s"> $string =~ tr/0-9A-Za-z/0-9A-Za-z/; </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 2 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 1 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a > </a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 129 </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="124">124</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 27 </td> <td class="s"> $string =~ tr[―~ _|.,:;!?][-~ _|.,:;!?]; </td> </tr> <tr> <td class="h" > <a name="125">125</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 16 </td> <td class="s"> $string =~ tr/()[]{}<>《》【】‘’“”/()[]{}<><>[]`\'""/; </td> </tr> <tr> <td class="h" > <a name="126">126</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 17 </td> <td class="s"> $string =~ tr[-+/*%=×][-+/*%=*]; </td> </tr> <tr> <td class="h" > <a name="127">127</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 15 </td> <td class="s"> $string =~ tr/‐@#$¥&^・/-@#$\\&^-/; </td> </tr> <tr> <td class="h" > <a name="128">128</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="129">129</a> </td> <td class="c3" > 3 </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td > 14 </td> <td class="s"> return $string; </td> </tr> <tr> <td class="h" > <a name="130">130</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="131">131</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> </td> </tr> <tr> <td class="h" > <a name="132">132</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1; </td> </tr> <tr> <td class="h" > <a name="133">133</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> __END__ </td> </tr> </table> </body> </html>