perl:tips
差分
このページの2つのバージョン間の差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
| perl:tips [2018/06/25 10:40] – 外部編集 127.0.0.1 | perl:tips [2018/07/20 14:06] (現在) – [マッチした語句を強調する] taka | ||
|---|---|---|---|
| 行 3: | 行 3: | ||
| ===== ユニコードハイフンの文字リスト ===== | ===== ユニコードハイフンの文字リスト ===== | ||
| - | 厳密には「ハイフン」ではないけど、「ハイフンっぽい」文字は種類が多く、一目では判別がつきにくい。Windows と Mac でもデフォルトで使われるハイフンが違ったりする。統一したい場合はこのリストを参考に一括置換してやると便利かも: | + | 厳密には「ハイフン」ではないけど、「ハイフンっぽい」文字は種類が多く、一目では判別がつきにくい。\\ |
| + | WindowsとMacでもデフォルトで使われるハイフンが違ったりする。\\ | ||
| + | 統一したい場合はこのリストを参考に一括置換してやると便利かも: | ||
| ^ 文字 ^ コード ^ 備考 ^ | ^ 文字 ^ コード ^ 備考 ^ | ||
| 行 25: | 行 27: | ||
| ===== スクリプトの設置場所をカレントディレクトリにする ===== | ===== スクリプトの設置場所をカレントディレクトリにする ===== | ||
| - | <sxh perl; gutter: false;> | + | <sxh perl> |
| BEGIN { | BEGIN { | ||
| - | use File:: | + | |
| - | chdir dirname( $0 ); | + | chdir dirname($0); |
| } | } | ||
| </ | </ | ||
| - | use lib qw( ./hoge/ ) などと use lib を使う場合はコンパイル時に変更する必要があるため BEGIN で括る。 | + | use lib qw(./hoge/) などとuse libを使う場合はコンパイル時に変更する必要があるためBEGINで括る。 |
| - | ===== Dumper で日本語を出力する ===== | + | ===== Dumperで日本語を出力する ===== |
| - | <sxh perl; gutter: false;> | + | <sxh perl> |
| use Data:: | use Data:: | ||
| - | my $dump = Dumper( \%hash ); | + | my $dump = Dumper(\%hash); |
| $dump =~ s/ | $dump =~ s/ | ||
| 行 47: | 行 49: | ||
| ===== コマンドラインにカッコよく出力する ===== | ===== コマンドラインにカッコよく出力する ===== | ||
| - | <sxh perl; gutter: false;> | + | <sxh perl> |
| - | my $ind = sprintf(" | + | my $ind = sprintf(" |
| print " | print " | ||
| 行 55: | 行 57: | ||
| 文字を上書きしながら出力する。 | 文字を上書きしながら出力する。 | ||
| - | ===== 実行環境の IP アドレスを取得する ===== | + | ===== 実行環境のIPアドレスを取得する ===== |
| - | <sxh perl; gutter: false;> | + | <sxh perl> |
| use Socket; | use Socket; | ||
| socket SOCKET, PF_INET, SOCK_DGRAM, 0; | socket SOCKET, PF_INET, SOCK_DGRAM, 0; | ||
| - | my $host_addr = pack_sockaddr_in( 9999, inet_aton( | + | my $host_addr = pack_sockaddr_in(9999, |
| connect SOCKET, $host_addr; | connect SOCKET, $host_addr; | ||
| - | my @sock_addr = unpack_sockaddr_in( getsockname( SOCKET ) ); | + | my @sock_addr = unpack_sockaddr_in(getsockname(SOCKET)); |
| - | my $local_ip = inet_ntoa( $sock_addr[1] ); | + | my $local_ip = inet_ntoa($sock_addr[1]); |
| print $local_ip," | print $local_ip," | ||
| 行 73: | 行 75: | ||
| </ | </ | ||
| - | ダミーの UDP ソケットを作り、それを相手ホストに connect() し、getsockname() で自分のアドレスを得る。IP アドレスやポート番号はダミーなので、必要な場合は適切なものに置き換える。 | + | ダミーのUDPソケットを作り、それを相手ホストにconnect()し、getsockname()で自分のアドレスを得る。\\ |
| + | IPアドレスやポート番号はダミーなので、必要な場合は適切なものに置き換える。 | ||
| ===== 小数点を含む数字の計算 ===== | ===== 小数点を含む数字の計算 ===== | ||
| - | Perl で小数点以下を扱うとコンピュータの性質上期待通りの結果が得られないことがある。これを回避するために、一旦小数点以下を含む数字を整数に戻して計算し、最後に再び少数点以下に戻すという回避策がある。以下のサンプルコードはその流れをサブルーチンにしたものであり、引数を二つとり引き算を行う。 | + | Perlで小数点以下を扱うとコンピュータの性質上期待通りの結果が得られないことがある。\\ |
| + | これを回避するために、一旦小数点以下を含む数字を整数に戻して計算し、再度少数点以下に戻すという回避策がある。\\ | ||
| + | 以下のサンプルコードはその流れをサブルーチンにしたものであり、引数を2つとり引き算を行う。 | ||
| - | <sxh perl; gutter: false;> | + | <sxh perl> |
| sub float { | sub float { | ||
| - | my ( $a, $b, $c, $x1, $x2 ); | + | |
| - | $a = shift; | + | |
| - | $b = shift; | + | $b = shift; |
| - | $a =~ s/0+$//; | + | |
| - | $a =~ s/\.$//; | + | $a =~ s/\.$//; |
| - | $b =~ s/0+$//; | + | $b =~ s/0+$//; |
| - | $b =~ s/\.$//; | + | $b =~ s/\.$//; |
| - | $a =~ / | + | |
| - | $x1 = $1; | + | $x1 = $1; |
| - | $b =~ / | + | $b =~ / |
| - | $x2 = $1; | + | $x2 = $1; |
| - | foreach ( length( $x1 ) ) { $a *= 10; } | + | |
| - | foreach ( length( $x2 ) ) { $b *= 10; } | + | foreach (length($x2)) {$b *= 10;} |
| - | $c = ( $a - $b ); | + | |
| - | foreach ( ( length( $x1 ) + length( $x2 ) ) ) { $d /= 10; } | + | |
| - | return $c; | + | |
| } | } | ||
| </ | </ | ||
| 行 109: | 行 114: | ||
| ===== 小数点を含む数字の四捨五入、切り上げ、切り捨て処理 ===== | ===== 小数点を含む数字の四捨五入、切り上げ、切り捨て処理 ===== | ||
| - | 小数点を含む数字の四捨五入(ROUND)、切り上げ(ROUNDUP)、切り捨て(ROUNDDOWN)を行う場合のサブルーチン。これも **小数点を含む数字の計算** と同様に浮動小数点以下の誤差を極力抑えるよう配慮している。ポイントとしては一旦数値を文字列として格納するところにある。第一引数に解析したい数字、第二引数に小数点以下の数、第三引数に round, roundup, rounddown のいずれかを指定する。 | + | 小数点を含む数字の四捨五入(ROUND)、切り上げ(ROUNDUP)、切り捨て(ROUNDDOWN)を行う場合のサブルーチン。\\ |
| + | これも **小数点を含む数字の計算** と同様に浮動小数点以下の誤差を極力抑えるよう配慮している。\\ | ||
| + | ポイントとしては一旦数値を文字列として格納するところにある。\\ | ||
| + | 第一引数に解析したい数字、第二引数に小数点以下の数、第三引数にround, | ||
| - | <sxh perl; gutter: false;> | + | <sxh perl> |
| use POSIX; | use POSIX; | ||
| sub roundNumber{ | sub roundNumber{ | ||
| - | my $data = shift; | + | |
| - | my $rate = shift; | + | my $rate = shift; |
| - | my $mode = shift; | + | my $mode = shift; |
| - | my $rate = 10 ** $rate; | + | |
| - | my $temp .= $data * $rate; | + | my $temp .= $data * $rate; |
| - | if ( $mode eq 'round' | + | |
| - | my $st_temp = $temp + 0.5; | + | my $st_temp = $temp + 0.5; |
| - | $data = floor( " | + | $data = floor(" |
| - | } | + | } |
| - | elsif ( $mode eq 'roundup' | + | elsif ($mode eq "roundup") { |
| - | $data = ceil( " | + | $data = ceil(" |
| - | } | + | } |
| - | elsif ( $mode eq 'rounddown' | + | elsif ($mode eq "rounddown") { |
| - | $data = floor( " | + | $data = floor(" |
| - | } | + | } |
| - | return $data; | + | |
| } | } | ||
| </ | </ | ||
| - | ===== UTF-8 なプログラムで UTF-8 以外のテキストファイルを出力する ===== | + | ===== UTF-8なプログラムでUTF-8以外のテキストファイルを出力する ===== |
| - | スタンダード入出力のUTF8指定をオフにする\\ | + | スタンダード入出力のUTF8指定をオフにする。 |
| - | <sxh perl; gutter: true;> | + | <sxh perl> |
| use utf8; | use utf8; | ||
| #use open ": | #use open ": | ||
| #use open ": | #use open ": | ||
| - | my $data = " | + | my $data = " |
| open FILE, "> | open FILE, "> | ||
| utf8:: | utf8:: | ||
| - | Encode:: | + | Encode:: |
| print FILE $data . " | print FILE $data . " | ||
| close FILE; | close FILE; | ||
| </ | </ | ||
| - | Memo1:\\ | + | === Memo1 === |
| - | CP932 はマイクロソフトが Shift-JIS を拡張したもの。\\ | + | |
| - | Shift-JIS の中でも文字範囲が広い。\\ | + | |
| - | Memo2:\\ | + | CP932はマイクロソフトがShift-JISを拡張したもの。\\ |
| - | Encode:: | + | Shift-JISの中でも文字範囲が広い。\\ |
| - | &# | + | |
| + | === Memo2 === | ||
| + | |||
| + | Encode:: | ||
| ===== マッチした語句を強調する ===== | ===== マッチした語句を強調する ===== | ||
| 行 167: | 行 176: | ||
| **サンプルソース:** | **サンプルソース:** | ||
| - | <sxh perl; gutter: true;> | + | <sxh perl> |
| - | my $string | + | my $string |
| - | my @keyWords = ( 'AAA', 'EEE', 'III' | + | my @keyWords = ("AAA","EEE","III"); |
| $string =~ s/& | $string =~ s/& | ||
| 行 177: | 行 186: | ||
| $string =~ s/& | $string =~ s/& | ||
| - | foreach my $keyWord ( @keyWords ) { | + | foreach my $keyWord (@keyWords) { |
| - | my @strings | + | my @strings = split / |
| - | | + | |
| - | next if ( $str =~ / | + | next if ($str =~ / |
| - | $str =~ s/ | + | $str =~ s/ |
| - | } | + | } |
| - | | + | |
| } | } | ||
| 行 200: | 行 209: | ||
| < | < | ||
| - | < | + | < |
| </ | </ | ||
| **備考:** | **備考:** | ||
| - | このように //split// のパターンを括弧で囲むと、パターンそのものも配列要素に含まれるようになる。 | + | このように// |
| - | <sxh perl; gutter: false;> | + | <sxh perl> |
| - | my $string | + | my $string |
| my @strings = split / | my @strings = split / | ||
| - | foreach ( @strings ) { | + | foreach (@strings) { |
| - | print "-> $_\n"; | + | print "-> $_\n"; |
| } | } | ||
| </ | </ | ||
| 行 219: | 行 228: | ||
| < | < | ||
| - | AAABBBCCC< | + | AAABBBCCC< |
| </ | </ | ||
perl/tips.1529890849.txt.gz · 最終更新: 2018/06/25 10:40 by 127.0.0.1