Perlについての質問箱 43箱目at TECH
Perlについての質問箱 43箱目 - 暇つぶし2ch112:デフォルトの名無しさん
10/03/17 16:14:08
unpack("H*", $str);

113:デフォルトの名無しさん
10/03/17 16:30:46
>>111
>>108の文章を読めばわかるはずだが、そのやり方ではできない。

WEBでサービスを利用してると、IDと一緒にパスワードも記録するってのはたまに見かけるでしょ?
>>101はIDと一緒にメモを記録しておこうってだけだよ。


#!/usr/bin/perl
use strict;
use CGI qw/:standard/;
use CGI::Cookie;

# 記録
my $cookie1 = new CGI::Cookie(-name=>'id', -value=>"ID");
my $cookie2 = new CGI::Cookie(-name=>'memo', -value=>"MEMO");
print header(-cookie=>[$cookie1,$cookie2]);

# 読取
my %cookies = fetch CGI::Cookie;
my $id = exists $cookies{'id'} ? $cookies{'id'}->value : "none";
my $memo = exists $cookies{'memo'} ? $cookies{'memo'}->value : "none";

print "id: $id\n";
print "memo: $memo\n";

CGIとして実行すると、初回はnone、2回目以降はIDとMEMOが表示される。

114:デフォルトの名無しさん
10/03/17 16:54:30
>>112
レスありがとうございます。
早速unpackの使い方を調べて
@chr = unpack("H*", $subject);
print "@chr\n";
を試してみました。結果は空白です。やっぱり変な変換のされ方を
してしまっているのかもしれません。

115:デフォルトの名無しさん
10/03/17 17:05:22
>>113

thank you
理解できました。

116:デフォルトの名無しさん
10/03/17 17:10:35
>>112
ワイド文字列をunpack 'H*'に食わせると各文字の下位8bitしか
出てこないので、俺はこんな感じの自作サブルーチン
使ってる。

sub hexdump {
my($s) = @_;

$s =~ s/(.)/sprintf "[%x]", ord($1)/ge;
return $s
}

117:デフォルトの名無しさん
10/03/17 17:17:38
>>116
それは>>86のプログラムに食わす前の$subjectの値が空白だったということか?
そんなら〓はどっから出てくんだよ。なんかおかしくね?

118:デフォルトの名無しさん
10/03/17 17:18:22
ごめんアンカミスった。>>116じゃなくて>>114

119:デフォルトの名無しさん
10/03/17 17:29:42
>>117
>>86を通る前の表示が記述ミスしていました。
「今日の天気は[雲の絵文字]です」が「cae56e29176f1367590a」となって
いて、同じ方法で>>86後の$subject_encodedをダンプすると空白になって
しまいました。

120:デフォルトの名無しさん
10/03/17 17:45:06
>>119
雲の絵文字があるはずの7文字目の文字コードの下2桁が
13ってことだな。

雲はU+E63F
〓はU+3013

なのですでにその時点で〓になってる疑いが濃厚。

URLリンク(www.nttdocomo.co.jp)

121:デフォルトの名無しさん
10/03/17 18:41:41
>>120
文字コードを調べたらUTF-8で3013は〓でした。perlを置くサーバーにメール
が届いた段階で〓に変えられているのでは、>>86を通しても…
〓にしないでメールを受け取る方法があるのでしょうか?

122:デフォルトの名無しさん
10/03/17 20:17:55
絵文字を〓に変換してるのは携帯キャリアのメル鯖。

123:デフォルトの名無しさん
10/03/17 23:34:13
>>121
gmailぐらいの交渉力があれば個別対応してもらえるけど、普通は
無理なんじゃないかなぁ。

124:デフォルトの名無しさん
10/03/18 09:14:35
>>122>>123
まずは自社サーバーで〓に変換されていない状態で受け取れないと無理ですね。
同じようなプログラムに挑戦した方が結構いるのかと思っていました。

125:デフォルトの名無しさん
10/03/18 13:38:39
サーバー、クライアントがあります。
クライアントがサーバーに対して
GET リクエストを出します。

この際、クライアントは、
GET xxxx HTTP/1.1
User-Agent:test1


とUser-Agent のヘッダを追加します。
つまり、クライアントからのリクエスには、上のUser-Agnet
のヘッダが含まれています。

サーバー上のパールプログラムの中でで、このUser-Agent の
test1 を変数として保持したいのですが、具体的な実装方法に
ついてアドバイスをお願いします。

126:デフォルトの名無しさん
10/03/18 13:50:15
>>125
$ENV{HTTP_USER_AGENT}

127:デフォルトの名無しさん
10/03/18 14:10:35
>>126

ありがとうございます。

128:デフォルトの名無しさん
10/03/18 14:35:34
GET /a.xml HTTP/1.1
Host: 192.16
Connection: close
User-Agent:
x-ModelName: pp-pppp
x-SDKVersion: 1.1.1

リクエストヘッダが上のようにあり、この中で特殊な、x-ModelName
の pp-pppp を取得したいと考えています。

しかし、
URLリンク(ja.wikipedia.org)

をみますと、これに該当する環境変数がありません。
この場合、どうやって、pp-pppp を取得できますでしょうか?

129:デフォルトの名無しさん
10/03/18 15:07:57
>>125,128
板違い

>>126みたいに板違いなのに回答するとこうやって図にのるのでみんなやめようね

130:デフォルトの名無しさん
10/03/18 16:00:44
>>129

どこの板に質問すればいいでしょうか?

131:デフォルトの名無しさん
10/03/18 16:03:03
>>130
>>1読め

132:デフォルトの名無しさん
10/03/18 16:03:13
>>130
>>1読め

133:デフォルトの名無しさん
10/03/18 16:07:58
>>131
>>132

thank you.

134:デフォルトの名無しさん
10/03/19 10:18:39
初歩的な質問ですみません。
改行コードを変換したいんですが

・次行の先頭が 'A' で始まる場合のみ、行末の改行を削除

これを

perl -pe 's/\nA//g'

とやっても期待した結果になりません(全く完全に何も置換されない)
環境はCygwin1.7です。

135:デフォルトの名無しさん
10/03/19 10:42:54
Treat string as multiple lines

136:デフォルトの名無しさん
10/03/19 10:54:20
>>134 s/\n(?=:A)//sg

137:デフォルトの名無しさん
10/03/19 10:59:03
間違えた
>>134 s/\n(?=A)//sg

138:デフォルトの名無しさん
10/03/19 15:57:58
改行区切りで読み込んでるからだろ
perl -p0e 's/\n(?=A)//g'

139:デフォルトの名無しさん
10/03/20 06:01:46
otsuneさんがウザくてamachangが爽やかなのはperlのせいですか?

140:デフォルトの名無しさん
10/03/20 06:21:57
はてなに帰れ

141:デフォルトの名無しさん
10/03/20 08:43:37
「処理済み」を表すフラグの変数名は何がいいですか?

142:デフォルトの名無しさん
10/03/20 08:56:41
done

143:デフォルトの名無しさん
10/03/20 09:02:41
ああ、それはいいな
finishとかprocessedとか、どうもしっくり来なかった

144:デフォルトの名無しさん
10/03/26 13:04:37
http::request の使用に関しての問題ですが、perl のプログラム(リフェレンス)の問題に
なりますのでここで質問させてもらいます。
URLリンク(search.cpan.org)
によりますと、
$r = HTTP::Request->new( $method, $uri, $header_ref, $content )
で三番目の引数が、reference to an HTTP::Headers object or a plain array
reference of key/value pairs.
とリフェレンスになっております。
Can't call method "clone" on unblessed reference at C:/Perl/lib/HTTP/Message.pm
line 32.
*たしかに、message.pm 内では、$header = $header->clone; 
となっております。
my %header = ('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded');
my $header_ref = \%header;
と三番目の引数をセットしています。
URLリンク(ftp.ics.uci.edu)
解決方法は、このあたりに書いてあるとおもうのですが、どのように三番目の引数をセットしてやればいいでしょうかアドバイス願います。

145:デフォルトの名無しさん
10/03/26 13:20:33
>>144
HTTP::Headersのオブジェクトにしたら良いよ

my $h = HTTP::Headers->new('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded');
この$hを第三引数に。

146:デフォルトの名無しさん
10/03/26 13:22:28
plain array referenceって書いてあるんだから、ハッシュじゃだめだろ。

my @header = ('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded');
my $header_ref = \@header;

147:デフォルトの名無しさん
10/03/26 13:25:15
エラーメッセージの行のまわりを見ればこうなっているわけだが。

if (ref($header) eq "ARRAY") {
$header = HTTP::Headers->new(@$header);
}
else {
$header = $header->clone;
}

148:デフォルトの名無しさん
10/03/26 13:50:13
レスありがとうございました。
解決いたしました。

>>145
オブジェクトを指定してうまく動作しました。
>>146
plain array reference を読み間違えておりました。配列であってハッシュではありませんでした。
>>147
アドバイス ありがとうございました。


149:デフォルトの名無しさん
10/03/27 00:11:17
perlから外部コマンドを実行して出力を格納するのに
バッククオートを使用しているのですが、
コマンドの文字列に$を含むような場合(環境変数とか)に
変数として展開されないようにする方法ってありませんでしょうか。


150:デフォルトの名無しさん
10/03/27 09:38:32
$を適切にエスケープすりゃいいんじゃねーの?

またはperlipc(1)の例にあるsafe backtick

# add error processing as above
$pid = open(KID_TO_READ, "-|");

if ($pid) { # parent
while (<KID_TO_READ>) {
# do something interesting
}
close(KID_TO_READ) || warn "kid exited $?";

} else { # child
($EUID, $EGID) = ($UID, $GID); # suid only
exec($program, @options, @args)
|| die "can't exec program: $!";
# NOTREACHED
}


151:デフォルトの名無しさん
10/03/27 16:02:53
お前らモダンPerlで書いてる?
俺はまだ勉強してないんだけど
モダンPerlの利点って何があるのか簡潔に書け。

152:デフォルトの名無しさん
10/03/27 17:14:04
Perl4互換で書いてる。念のため

153:デフォルトの名無しさん
10/03/27 17:42:38
Mooseとかは使わないけどPerl4互換とか絶対あり得ないわw

154:デフォルトの名無しさん
10/03/27 18:45:16
自分で使うためのものしか考えてないから、5.10で追加されたものも普通に使って書いてる
いまさらPerl4互換とかないわー

155:デフォルトの名無しさん
10/03/27 18:49:09
perl4ってどんなの?
localとか使うん?

156:デフォルトの名無しさん
10/03/27 19:38:50
>>155
URLリンク(www2n.biglobe.ne.jp)

157:デフォルトの名無しさん
10/03/27 19:48:28
関数の引数は、localで受ける方が自然に見えるのは俺だけ?

sub func
{
    local($x, $y)=@_;

まあ慣れなんだけど

158:デフォルトの名無しさん
10/03/27 20:10:32
おまえとKENTだけ

159:デフォルトの名無しさん
10/03/27 20:21:09
myだろ普通
JavaとかPHPとか他の言語は自動的に局所変数だ

160:デフォルトの名無しさん
10/03/28 09:35:47
最近は受ける変数名を考えるのが面倒だから
$_[0]とかを直接使ってるw

161:デフォルトの名無しさん
10/03/28 13:56:50
pythonのctypesに相当するものはありますか?

162:デフォルトの名無しさん
10/03/28 14:03:11
ん?PythonってCのやり方に頼りだしたんだw

163:デフォルトの名無しさん
10/03/28 14:04:47
書き忘れた
CPANでCtypeで検索しろ

164:デフォルトの名無しさん
10/03/29 11:12:09
swigしかないようです

165:デフォルトの名無しさん
10/03/29 12:40:00
Archive::Zipの解説しているWebPageないでしょうか。
できれば日本語で・・・

ぐぐっても、圧縮/解凍のやりかたしか出てない;;

166:デフォルトの名無しさん
10/03/29 16:31:31
>>165
「圧縮/解凍のやりかた」以外の何を知りたいのか
具体的に書くべきだろうな、そういう時は。
「マニュアルに書かれている内容が理解できないので
噛み砕いて教えて下さい」って言ってるのと同義なんだから。
URLリンク(search.cpan.org)
URLリンク(search.cpan.org)

167:デフォルトの名無しさん
10/03/29 16:48:45
>>166
すみませんでした。

具体的にやりたいのは、画像ファイルを無圧縮ZIPに固めておき、それを解凍せずにブラウザに表示したいのです。
ローカルファイルを開いたハンドルから表示するのは出来たので、
ZIP内のファイルのハンドルが取れれば、出来そうなのですが・・・

my $zip = Archive::Zip->new('test.zip');
my $fh = $zip->open('hoge.jpg');

みたいに出来たらな・・・と。


168:デフォルトの名無しさん
10/03/29 19:22:43
>>167
お望みの物はArchive::Zip::MemberReadかい


169:デフォルトの名無しさん
10/03/30 15:14:12
>>168
ありがとうございます。
早速調べて試してみたのですが、Not a GLOB reference のエラーが出ます。perl は初めてなので、なにか勘違いしていると思いますが、それがどこかわかりません。

#!/usr/bin/perl
use Archive::Zip;
use Archive::Zip::MemberRead;

$imgtype = 'jpeg';
#// file ①
# open(IMG, "./1.jpg") or die;

#// zip ②
$zip = Archive::Zip->new('./1.zip');
$IMG = Archive::Zip::MemberRead->new($zip, "1.jpg");

#// イメージ表示
binmode $IMG;
binmode STDOUT;
print "Content-type: image/$imgtype\n\n";
print while (<$IMG>);
#// 画像クローズ
close($IMG);
#// 終了
exit(0);

①を生かし、②を殺すとうまくいきますが、逆だと binmode $IMG の箇所でNot a GLOB referenceとなります

170:デフォルトの名無しさん
10/03/30 16:28:22
Archive::Zip::MemberReadは中をのぞいてみたけど
ハッシュをblessしただけの普通のオブジェクトだから
ファイルハンドルとしては使えない。あくまで同じような
メソッドが用意してあるだけの普通のオブジェクト。
binmodeとかはムリ。

IO::Stringみたいにグロブにtieしていろいろがんばれば
なんとかなるけどそこまではやってないようです。

171:デフォルトの名無しさん
10/03/30 16:55:00
テンポラリに展開して、それを読み込んだほうが良さそうですね。
そういう方向で修正していって見ます。

わざわざ中をのぞいていただき、ありがとうございました。


172:デフォルトの名無しさん
10/03/31 21:16:21
ドキュメントぐらい読めよ関数名見りゃだいたい分かるだろ
$zip->contents(FILENAME);

173:デフォルトの名無しさん
10/04/01 11:14:51
>>172
テンポラリファイルを使用する形で出来上がっていましたが、$zip->contents(FILENAME)を使用することで
「ファイルの書き込み→読み込み→出力」が、「ファイルの読み込み→出力」にすることが出来ました。
画像の縮小をさせるとレスポンスが遅いのですが、玄箱には重過ぎるのでしょう。

まだフロント(iアプリ)はテスト用でしか試してませんが、なんとか目処がつきました。
ありがとうございます。


174:デフォルトの名無しさん
10/04/01 17:09:07
Perlのバイブル本って何?

175:デフォルトの名無しさん
10/04/01 17:12:59
プログラミング言語Perl

176:デフォルトの名無しさん
10/04/01 17:31:06
正直最初にその1冊買ってそれが最後の本になるなw
あとはCPANとかでいろいろ探しまくる作業が残りの半分。

177:デフォルトの名無しさん
10/04/01 17:40:50
>>175
どの本ですか?
アマゾンなどのリンクください。
プログラミング言語Perlマスターコース
プログラミングPerl
という本なら見つかるのですが

178:176
10/04/01 17:43:19
ああ、俺が言ってるヤツは プログラミングPerl。
オライリーのらくだ絵の本。Perl開発者が書いたやつ。

179:デフォルトの名無しさん
10/04/01 19:04:29
モダンPerl読んだ方がいいと思う

180:デフォルトの名無しさん
10/04/01 19:14:03
それバイブルどころか入門書じゃないの?

181:デフォルトの名無しさん
10/04/01 19:30:19
プログラミングPerlって説明が古いじゃん

182:デフォルトの名無しさん
10/04/01 23:06:19
Effective Perlがいいぞ

183:デフォルトの名無しさん
10/04/01 23:17:35
モダンPerlはサスペンダーが大絶賛してたから意地でも読まない

184:デフォルトの名無しさん
10/04/01 23:57:33
江川達也さんは何の本でもたいしてちゃんと読まずに大絶賛するだろうが

185:デフォルトの名無しさん
10/04/02 00:19:10
モダンPerl読んだけど、情報がとびとびでさっぱり理解できない
初心者にすすめるもんじゃないよありゃ

186:デフォルトの名無しさん
10/04/02 02:40:11
プログラミングPerlは思想的に面白い。
Perl6なんて本当は完成させたくないんだよ。
綺麗すぎる言語は退屈だ。

187:デフォルトの名無しさん
10/04/06 00:05:27
Linux上で動かすPerlについて質問があります。
ファイルリストに記載されているファイルのみを
別のディレクトリにコピーしたいのですが、
どのようなコードを書けばよいのでしょうか?
ファイルリストを読み込み、$file_listで1文字ずつ表示させる状態にして、
system("cp $file_list $dir_name");とやっているのですが、うまくいきません。

188:デフォルトの名無しさん
10/04/06 00:16:52
>>187
print `cp $file_list $dir_name`;
エラーがあるならこれで分かるんじゃないか

189:デフォルトの名無しさん
10/04/06 00:31:12
俺の予想では、chompするとうまくいく

190:デフォルトの名無しさん
10/04/06 04:09:32
俺が touch ';rm -fr /;' しといてやるぜw >>187

191:デフォルトの名無しさん
10/04/06 20:19:04
blessしたオブジェクトをscalar($self)した時に
任意の文字列を返すにはどうすればよいでしょうか?

例えばDateTimeモジュールはDateTime->now()でオブジェクトを取得しますが、
scalar($now)すると現在時間が文字列で返ってくるのですが、
こういうのはどう実装すればよいでしょうか?

192:デフォルトの名無しさん
10/04/06 20:38:04
少なくともDateTimeではscalar使った時点で文字列に変わったりはしない
print $now; とか my $datestr = "$now"; で文字列になることを言ってるんなら、overload

193:デフォルトの名無しさん
10/04/08 01:08:37
>191
use overload ( 略
'""' => '_stringify',


194:デフォルトの名無しさん
10/04/10 00:38:14
どうしても文字化けしてしまいます。
どなたかヒントでも頂けるとありがたいです。

WWW::Mechanize でCSVをダウンロードします。
その後print や Encode::decode などすると「Wide character ....」 と表示されました。
UTF8フラグが立っているのかと思い、Encode::encode("utf8",$data_str) などして、
ファイルを保存して開いてみると文字化けしてしまいます。
エディタはEmacsでエンコード指定して開き直したりもしてみました。

本当に試行錯誤して、encodeやdecodeのいろんな指定をしてみましたがダメでした。
しかしブラウザからCSVをダウンロードするとエクセルできちんと開きますし、
Emacs で UTF-8 で開くことが出来ます。

正直、分かりません・・・。

195:デフォルトの名無しさん
10/04/10 00:43:24
Encode::from_to($data_str, "utf8", "cp932");

196:デフォルトの名無しさん
10/04/10 01:25:59
>>194
わかってないなら弾の言う通りに書けよ。

197:194
10/04/10 02:00:29
単純にdos窓で表示できない、と言う訳ではありません。Emacsで開いているので。

ブラウザで落とすとUTF8になっているので、ファイルはUTF8なんだと思うんですが。。

Mechanizeのcontent には独特なエンコードルールが有るんでしょうか?
contentのデータをencodeするのがマズイのかな。

198:デフォルトの名無しさん
10/04/10 02:23:11
Mech使わないから知らんけど、LWP::UserAgentとかみたいにHTTP::Responseでデータ返してくれるんなら
my $content = $res->decoded_content(charset => 'none'); # $res isa HTTP::Response
で生データ取れるからそれをそのまま保存するなりすればいいかと。

199:デフォルトの名無しさん
10/04/10 02:42:18
文字化けとかUTF8と思うとか曖昧なこと言わないで
バイナリエディタで中身見ればいいのに

200:デフォルトの名無しさん
10/04/10 02:54:08
>ファイルはUTF8なんだと思うんですが。
思うってなんだそりゃw
自分で見てから判断しれよ

201:デフォルトの名無しさん
10/04/10 04:20:49
>>194
とりあえずDevel::Peekなりでdumpしてutf8flagが立ってるかどうかをちゃんと確認した方がいい。
曖昧なまんまの推測だと答えも推測になるからなかなか答えにたどり着かんよ

202:デフォルトの名無しさん
10/04/10 05:28:58
>>194
iso-8859-1なんじゃねえの?

203:デフォルトの名無しさん
10/04/11 00:35:30
Spidering Hacksに載ってたな

204:デフォルトの名無しさん
10/04/11 00:42:17
Spidering Hacksの内容は今となってはさすがに古過ぎる
スクレイピングのマナーとか心構えとかは参考になるけどな

205:デフォルトの名無しさん
10/04/14 19:52:51
もう5年以上前になると思いますが、
Perlで書かれたプログラムを実行するとラクダの形で文字列が出力され、
そのプログラム自体もラクダの形に揃えられていたものをみたのですが、
探してみてもなかなかみつかりません。

少ない情報ですが、お分かりの方はいませんでしょうか?

206:デフォルトの名無しさん
10/04/14 20:21:48
Acme::EyeDropsじゃねーの

207:デフォルトの名無しさん
10/04/15 23:32:19
URLを画面に表示する時に、指定した文字数より長すぎる場合、
ディレクトリ階層を優先してまびくようにするにはどうしたらいいでしょうか?
例:
$url = "URLリンク(www.abc123.net)" ←65文字
$url = omiturl($url, 50);
print $url;
この結果としてこんな感じにしたいです
URLリンク(www.abc123.net) ... /vwxyz/foo1234.html ←47文字

208:デフォルトの名無しさん
10/04/16 00:36:20
>>207

use URI;
sub omiturl {
 my $uri = URI->new(shift);
 my $maxlen = shift;

 my $repl_q = quotemeta(my $repl = "...");
 my $path = $uri->path;
 until (length "$uri" <= $maxlen) {
  $path =~ s,\A/(?:$repl_q/)?[^/]+,/$repl, or last;
  $uri->path($path);
 }
 return "$uri";
}

手っ取り早くURI使ってるから$replに半角スペースとか使うと%20にされちゃうんで、
そのへん気に入らなかったら適当に直してくれ

209:デフォルトの名無しさん
10/04/16 04:53:00
>>208
便利につかわさせて頂きます。
ありがとうございました。

210:デフォルトの名無しさん
10/04/16 05:59:51
localhost/p2/read.php?host=pc12.2ch.net&bbs=tech&key=1266565626&ls=208-#r208
のようなクエリ文字列 or フラグメントの長いURLを>>208に通すと無限ループするな
見た感じだとマッチしなくなった時点でループを抜けるように書かれてると思うけど、なぜだろう

211:デフォルトの名無しさん
10/04/16 06:53:08
マッチもしないし文字数もこれ以上短く出来なくなったら無限ループだな。
例えば文字の長さを10とかやったら絶対無限ループ

212:208
10/04/16 10:08:30
oh…やっちまった……テストはちゃんと書きましょうってことだな…
untilを↓に差し替えで無限ループは回避できるはず。>>207がまだ見てることを祈る…
 for (my $i = 0; length "$uri" > $maxlen and $i < 20; $i++) { # ループ20回で強制的に抜ける
  $path =~ s,\A(/(?:$repl_q/)?[^/]+),/$repl, or last;
  last if $path eq $1; # マッチするが置換しても内容が変わらない場合抜ける
  $uri->path($path);
 }

213:デフォルトの名無しさん
10/04/16 22:26:22
Cだと
static char hoge[128];
write(fd, hoge, 128);
とすれば128バイト分の0x00が書き込まれると思うのですが
perlだとどのように記述すればいいでしょうか?

214:デフォルトの名無しさん
10/04/16 22:45:34
print 0x00 x 128;

215:デフォルトの名無しさん
10/04/16 22:46:25
あ、ごめん "\x00" x 128 だ

216:デフォルトの名無しさん
10/04/17 00:38:56
>>214
>>215
ありがとうございます、繰り返し演算子という奴を使うんですね。

217:デフォルトの名無しさん
10/04/17 16:23:26
配列の任意の位置に要素を入れるにはどうすればいいのでしょうか?

my @arr = qw(a b c d e);
my $i = 3;

??? add_elem @arr, $i, "z";

print "@arr"; #=> a b c z d e

218:208
10/04/17 17:34:11
splice @arr, $i, 0, "z";

219:デフォルトの名無しさん
10/04/17 18:05:40
>>218

できました

220:デフォルトの名無しさん
10/04/21 18:25:44
require HOGE::FUGA; を require $foo; みたいにして、
HOGE::FUGAの代わりにHOGE::PIYOを読むように動的に変更したいのですが、
この場合'HOGE/FUGA.pm'ってパス指定しないとうまくいきません。
出来ればHOGE::PIYOのような形式で指定したいのですが、
上手い方法はないでしょうか?

221:デフォルトの名無しさん
10/04/21 18:26:35
なるほど、evalの中でrequireするか、でなければUNIVERSAL::require使えばよいのか。

222:デフォルトの名無しさん
10/04/22 00:53:15
こんばんは
Perlでグラフを書く必要がありGD::Graphというモジュールを発見したので
使おうと思っていろいろ調べました。
その結果、このモジュールは軸を対数表示にすることができない?ようなんですが
この認識であってますかね?

URLリンク(search.cpan.org)

223:デフォルトの名無しさん
10/04/22 00:58:38
対数計算した座標渡せばいいだけでは

224:デフォルトの名無しさん
10/04/22 02:12:27
それだとグラフ自体は意図通りに描画されるかも試練が
軸の目盛り(?)が意図したようにならんのでは?

225:デフォルトの名無しさん
10/04/22 05:03:24
じゃあ使うのやめれば

226:224
10/04/22 11:20:42
おれは使ってないぞw

227:デフォルトの名無しさん
10/04/22 19:34:23
>>223
レスありがとうございます。
描画はそれでいけますが素直にgnuplotのほうが無難かな。



228:デフォルトの名無しさん
10/04/22 22:51:17
データだけ吐いてR言語がいいぞ

229:194
10/04/22 23:50:50
文字化け

use strict;
use warnings;
use utf8;
use Encode;
use Net::Delicious;

my $delicious = Net::Delicious->new({user=>'hoge',pswd=>'fuga'});
my $agent = LWP::UserAgent->new;

foreach my $bookmark ( $delicious->recent_posts ) {

my $url = $bookmark->url();
print utf8::is_utf8($bookmark->description) . "\n";
my $title = Encode::encode('utf8',$bookmark->description);
my $tags = Encode::encode('utf8',$bookmark->tags);
$tags =~ s/([^ ] )/#$1/g;

print $title . "\n";
print $tags . "\n";
print "---------------------------------------------\n";
}

上のようなスクリプトをかきましたが、descriptionが文字化けしてしまいます。

Net::Delicious からとったデータはutfフラグがたっていたので、そのままencodeしました。

UTFフラグがたったものをencodeして文字化けする場合はどのように対処すれば良いでしょうか?

230:デフォルトの名無しさん
10/04/23 02:37:56
>>229
試してみたけど文字化けしないな
使い方も問題なさそうだけど

231:デフォルトの名無しさん
10/04/23 15:55:39
>>229
cpan moduleがencodeに対応してたりしてなかったりするものを混ぜると
わけわかんなくなる場合がある。
関係してそうなmoduleかたっぱしからupdateしてみ

232:デフォルトの名無しさん
10/04/23 16:31:43
package TestC;
sub new{
  my $class = shift;
  my $self = {
    a => [],
  };
  return bless $self, $class;
}

----
my $c1 = new TestC;
my $c2 = new TestC;

としたときに $c1 と $c2 の a が同じものになってしまいます。
($c1 で編集すると $c2 も同じになる)
インスタンスごとに配列も別の実態を参照してほしいのですがどうすればよいでしょうか?

233:デフォルトの名無しさん
10/04/23 16:50:56
普通ならないけどな。編集して同じになったというのが
わかるソースも出せよ。

package TestC;
sub new{
my $class = shift;
my $self = {
a => [],
};
return bless $self, $class;
}

package main;
$c1->{a}->[0] = 100;
printf "c1: %d, c2: %d\n", $c1->{a}->[0], $c2->{a}->[0];

すくなくとも上記で試した限りでは結果は

c1: 100, c2: 0

だった。

234:デフォルトの名無しさん
10/04/23 16:55:03
>>232
別物みたいだけど?

package main;
my $c1 = new TestC;
my $c2 = new TestC;

warn '$c1->{a} and $c1->{a}: ' . is_equal($c1->{a}, $c1->{a});
warn '$c1->{a} and $c2->{a}: ' . is_equal($c1->{a}, $c2->{a});

sub is_equal {
my($x, $y) = @_;

($x eq $y) ? 1 : 0;
}

package TestC;
sub new{
my $class = shift;
my $self = {
a => [],
};
return bless $self, $class;
}

1;

====================
$c1->{a} and $c1->{a}: 1
$c1->{a} and $c2->{a}: 0

235:232
10/04/23 17:05:46
>>233
すいません、長くなりそうなのではしょってしまいました。
以下を実行すると
c1 2
c2 2
と表示されます。@5.10.0

package TestC;
####new省略
sub push_array{
  my $self = shift;
  my $a = $self->{a};
  push @a, $_[0];
}
sub get_count{
  my $self = shift;
  my $a = $self->{a};
  return @a;
}
package main;
my $c1 = new TestC;
my $c2 = new TestC;
$c1->push_array(1);
$c2->push_array(2);
print "c1 ".$c1->get_count."\n";
print "c2 ".$c2->get_count."\n";

236:デフォルトの名無しさん
10/04/23 17:18:56
use strictしなかった結果がこれだよ!

237:デフォルトの名無しさん
10/04/23 17:40:45
$a!

238:デフォルトの名無しさん
10/04/23 17:43:02
$a ≠ @a

239:デフォルトの名無しさん
10/04/23 17:44:47
$aと@aは全くの別物。このプログラムに登場する@aはmyで宣言されてない
から常に同じパッケージ変数が使われてる

あと$a, $bはsortが使う特別な変数なのでそれ以外の用途で使うとろくな目に
会わないからやめとけ。

240:デフォルトの名無しさん
10/04/23 20:07:59
$a使った結果がこれだよ!


241:デフォルトの名無しさん
10/04/23 20:08:54
sortが$a, $bを使うという仕様を見た時は目ん玉飛び出たな
どんな糞仕様だよと

242:デフォルトの名無しさん
10/04/23 20:56:57
どこが?
Perlなら妥当な仕様だろ。

243:デフォルトの名無しさん
10/04/23 21:14:28
$_ とか $@ とか $! とかも糞仕様

244:デフォルトの名無しさん
10/04/23 21:26:09
つまりPerlは糞言語だから糞仕様なのがむしろ妥当だと

245:デフォルトの名無しさん
10/04/23 22:34:24
$aと$bをどう使うと降順になるのか何度やっても覚えない
そもそも、降順と昇順の意味がピンと来ない

246:232
10/04/23 22:44:39
返答が遅くなり申し訳ありません。
色々と得心がいきました。
解決したところで引き続き頭をこねこねしたいと思います。
ありがとうございました。

247:デフォルトの名無しさん
10/04/23 23:26:38
$_やら$@やら$!はだれがプログラムしても同じ変数だから分かりやすい
っていう話があってだな

248:デフォルトの名無しさん
10/04/24 00:01:40
>>247
なるほど
そう考えると確かにと思わざるを得ない

ただあまり使わない特殊変数は検索かけても引っかかってこないのがウザい

249:デフォルトの名無しさん
10/04/24 00:03:24
perldoc perlvar

250:デフォルトの名無しさん
10/04/24 00:26:59
とりあえず>>245が頭が悪いと言う事はわかった

251:デフォルトの名無しさん
10/04/24 01:56:06
UTF-8 で書かれたテキストファイル hoge.txt の内容を
Windowsのバッチファイルからワンライナーで
msg="おはよう"
から
msg=こんにちは
に置換したいんですが・・・

perl -i.BAK -pe "s/(?<=msg=).*/こんにちは/" hoge.txt

これだとシフトJISで書き込まれてしまうんです。
UTF-8 で書き込む方法があれば教えてください。

252:デフォルトの名無しさん
10/04/24 10:37:27
見つけたよ特殊変数のスレ
同じプログラム板じゃないか


Perlの特殊変数は氏ね。絶対に使うな。可読性下がる
スレリンク(tech板:34番)

34 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/11(土) 22:02:24
特殊変数は、他人や「昔の自分」が書いたソースに出てきても
まったく可読性に影響の無い、数少ない構成要素の一つだろう。
同じ名前の変数には、常に同じ意味を持つものが入ってるんだから。

「これ何のためにあるの?何が入ってるの?」って状態になるのは普通の変数のほう。



253:デフォルトの名無しさん
10/04/24 14:02:59
>>251
文字コードがsjisであれば、
perl -i.BAK -pe -MEncode "s/(?<=msg=).*/Encode::from_to('こんにちは','sjis','utf8')/e" hoge.txt

>>252
可読性とか書きようによってはいくらでも良くなるし悪くもなるもんなのに、言語仕様のせいにするのはおかしいよね。
他の言語から見れば、Perlは変数の前に$@%*とか使ったり、特殊変数の意味が理解できないだろうから気持ち悪く映るんだろうけど。

254:デフォルトの名無しさん
10/04/24 18:26:39
$@%があるからスカラなのか配列なのか、分かりやすくて良いと思う俺って少数派?

255:デフォルトの名無しさん
10/04/24 18:27:43
多数派

256:デフォルトの名無しさん
10/04/24 20:20:59
じゃあリファレンスも別のプリフィクスを採用するべきだったよね
あと配列もハッシュも中身にアクセスするとき$プリフィクスを要求するのは分かりにくいよね(これはperl6で変更になるけど)

257:デフォルトの名無しさん
10/04/24 20:23:23
あれはあれでいいんだよ

258:194
10/04/24 20:59:32
>>231,230
Macだといけました。
Windowsだと化けるんだな。。
ppmのモジュールは確かに古かったから、cpanで入れ直してみようかと思います。

ちなみにeshellで出力してるので、winでもcp932にencodeしなくても大丈夫です。
てかこれで途中までは日本語がきちんと表示されます。


259:デフォルトの名無しさん
10/04/25 01:08:38
>>256
おれはperl5の方が好きだ
スカラだから$で統一されててわかりやすい

260:デフォルトの名無しさん
10/04/25 03:03:46
最終的に得るものがスカラ、という考え方か
例えばデリファレンスで配列を得たけりゃ@$array_refだし
確かにそりゃそうだなぁ

261:デフォルトの名無しさん
10/04/25 05:23:43
あれだよな。@は配列変数 って書くサイトや本が悪いよな。
配列へのアクセスなのに。

262:デフォルトの名無しさん
10/04/25 10:58:03
>>260
そういう思想で作ってあるって習ったから覚えやすかった

263:デフォルトの名無しさん
10/04/25 14:29:25
@names = ('OZA-', 'POPPO', 'MASZOE');
@mes = ('012345678901234567890123456789', 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ', いいいいい);
例えばこのようなものを、次のように2つのカラムがあるかのように出力したいのですが、どうしたらできるでしょうか?

OZA-   .| 012345678901234567890123
      ...| 456789
POPPO  | あいうえおかきくけこさしすせそたちつてとなにぬ
      ...| ねのはひふへほ
MASZOE .| いいいいい

こんなのでできるかなと思ったのですが無理でした…
format AAA =
@<<<<<<<<<< | @<<<<<<<<<<<<<<<<<<<<
~~        | @<<<<<<<<<<<<<<<<<<<<
.
よろしくお願いします。

264:デフォルトの名無しさん
10/04/25 14:47:40
と思ったらformatでできました。お騒がせしました。

265:デフォルトの名無しさん
10/04/25 19:20:18
>>253
ありがとうございます。すごい勉強になります。

> perl -MEncode -i.BAK -pe "s/(?<=msg=).*/Encode::from_to('こんにちは','sjis','utf8')/e" hoge.txt
だと Modification of a read-only value attempted at C:/Perl/lib/Encode.pm line 195, <> line 280. って叱られるので

perl -MEncode -i.BAK -pe "s/(?<=msg=).*/$s='こんにちは';Encode::from_to($s,'sjis','utf8');$s/e" hoge.txt
でできました!

Jcode使えば少し短くなりました
perl -MJcode -i.BAK -pe "s/(?<=msg=).*/Jcode->new('こんにちは','sjis')->utf8/e" hoge.txt


266:デフォルトの名無しさん
10/04/26 12:59:43
Perlの特殊変数って言っても、使うのは $_ $@ @_ とかほとんどこんなもんだろ。全部覚えてる奴なんてまずいない。

267:デフォルトの名無しさん
10/04/26 14:39:27
最低限:$_ @_ $1~$9 $a $b
覚えてると便利:$@ $! $. $/ $? $$
ゴルフやるなら:$\ $, $" $& $` $' @F

268:デフォルトの名無しさん
10/04/26 21:46:22
open IN,"file";

while(<IN>){
$str .= $_;
}

file内のテキスト全てを、$strというスカラー変数に代入してみました。
ファイルサイズが小さければ問題ないが何万行とかだと代入処理に失敗しますよね?

269:(!>>268)
10/04/26 22:29:11
そういえば数値はスカラに2^1023以上、2^1024未満が入ったけど、
このヘンの上限というか仕様ってどこか載ってます?


270:デフォルトの名無しさん
10/04/26 23:29:24
>>266
それは文法の一部で、特殊変数じゃない

271:デフォルトの名無しさん
10/04/27 02:49:33
>>268
open IN,"file";
read IN,$str,-s IN;

272:デフォルトの名無しさん
10/04/27 03:17:45
use File::Slurp;
$str = read_file('filename');

>>268
メモリあれば大丈夫だよ。ただ毎行 .= すると遅い

273:デフォルトの名無しさん
10/04/27 17:40:54
教えてエロい人

perlはいつからスカラの要素を参照するときに@で参照できるようになったんだ?
my @sca = (1,2,3);
print $sca[1]; // OK...
print @sca[1]; // OK?!
@sca[1] = 'x';
print @sca[1]; // OK?!?!


274:デフォルトの名無しさん
10/04/27 17:49:04
>>273
それスカラじゃなくてたまたま1要素の配列スライス。
配列スライス自体はperl4の昔からすでにあった。
それより前はシラネ

275:デフォルトの名無しさん
10/04/27 17:53:30
my @sca = (1,2,3);
@sca[0..2] = "a".."c";
print @sca[0..2], "\n", @sca[0, 2], "\n", @sca[0];

276:273
10/04/27 18:08:51
>>274,275
なるほど!とんくす!

277:デフォルトの名無しさん
10/04/29 21:10:07
xpでactiveperl v5.8.9を使ってたら、
使えてたスクリプトが急に「問題が発生したため」云々のウィンドウを出して止まるようになった
ファイルが12728あるディレクトリでreaddirをしたのが原因みたい
ファイルの少ないところで使うと問題ない
なんか制限あったっけ

278:デフォルトの名無しさん
10/04/29 21:25:34
違った
260文字あるファイル名のせいだった

279:デフォルトの名無しさん
10/04/30 17:50:08
Perl/Tkで作ったテキストウィジェットに1秒置きに1-10の数字を表示させるにはどうすれば良いですか?

280:デフォルトの名無しさん
10/04/30 22:56:37
>>279
URLリンク(search.cpan.org)


281:デフォルトの名無しさん
10/05/05 15:50:31
バッチファイル(hoge.bat)の1行目に
PATH C:\hage;%PATH%
と「挿入」したいんですけど、
ワンライナーでできますか?
できるならやり方を教えてください。

282:デフォルトの名無しさん
10/05/05 16:00:35
open BAT '>hoge.bat'; print BAT 'PATH C:\hage;%PATH%';print BAT <BAT>;
こんな感じ?

283:デフォルトの名無しさん
10/05/05 16:07:04
愚直に
perl -e "open my $FH,'<','hoge.bat';my @l=<$FH>;close $FH;open $FH,'>','hoge.bat';print $FH \"PATH C:\\hage;\%PATH\%\n\",@l;"


284:デフォルトの名無しさん
10/05/05 16:15:23
perl -p0i -e 's/^/PATH C:\\hage;%PATH%\n/' hoge.bat

Windowsだとシングルクオートじゃなくてダブルクオートじゃないとだめなんだっけか
でもこのままやると%PATH%が展開されちゃったりするのか?よくわからんから適当に直してくれ

285:デフォルトの名無しさん
10/05/05 17:13:28
>>284
できました!ありがとう。

perl -i.BAK -p0 -e "s/^/PATH C:\\hage;%%PATH%%\n/" hoge.bat


286:デフォルトの名無しさん
10/05/07 01:58:11
perlのスクリプトを含むWindowsのパッケージを
setup.exe
みたいな塊にまとめたいのですが
何がおすすめでしょうか?
昔単なる実行ファイルだけのときは
innoSetup使ってたけど

287:デフォルトの名無しさん
10/05/07 07:21:30
PAL
Perl2EXE

288:デフォルトの名無しさん
10/05/07 12:04:34
関数の命名でヒントください

「array化」を英語で書くとしたら
「arraylize」「arrailise」「arrailize」、
どれにしたらよいでしょうか?

テキストを読みこんで、それを配列に格納する
というありふれた機能を持つ関数の名前です
下のように使っています

my @list = arraylize ( "list.dat" ) ;

sub arraylize {
my $name = $_[0] ;

open ( FH ,"< $name" ) ;
my @listArray = <FH> ;
close (FH) ;

return @listArray ;
}

他にも、もっと語呂のいい名前があったら教えてください
それ以前に、同じような動作をするものがあったら知りたいです



289:デフォルトの名無しさん
10/05/07 12:16:00
いきなりファイル名でというのは知らないけど、強いて言えば
IO::Handleのgetlinesが近いかなぁ。

本題とは関係ないが、せめてopenのエラー処理( or die $!
をつける程度でいいよ)はやっとけ。後で苦労するぞ。

290:デフォルトの名無しさん
10/05/07 12:27:01
「ファイルを読み込んで配列を返す」処理につける名前にしちゃ arraylize は筋が悪いな
readfile なり readlines なりでいいだろ

どうしても array が重要だっつーんなら make_array

291:デフォルトの名無しさん
10/05/07 12:30:10
まんまでいいなら、file2array

292:デフォルトの名無しさん
10/05/07 12:35:40
sub arraylize {
my $name = shift ;

open ( my $fh ,"<", $name ) ;
my @listArray = <$fh> ;
close ($fh) ;

return @listArray ;
}


関係ないけど

293:デフォルトの名無しさん
10/05/07 12:39:50
>「arraylize」「arrailise」「arrailize」
l はどっから出てきたんだよ

294:デフォルトの名無しさん
10/05/07 13:18:58
セパレータが指定されたら split した配列を返したり、
配列だったらそのまま返したり、
ハッシュだったら key/value をセパレータで繋げた配列を返したり・・・
そこまでやって、初めて arraylize を名乗っていい。
そう思うんだ。

どうでもいいけど

295:デフォルトの名無しさん
10/05/07 13:37:18
to_arrayじゃダメなん?

296:デフォルトの名無しさん
10/05/07 14:12:49
ありがとうございます
単純にfile2arrayにします

エラー処理や
ファイルハンドルに$fh、
そこのところ貰います


297:デフォルトの名無しさん
10/05/07 14:42:16
my %tmp;
@tmp{qw(foo bar baz)} = split(/,/, $_, 3);
push(@result, \%tmp);

みたいなコードがあるんですが、これを %tmp を使わずに一行で済ます書き方ってあるでしょうか。
mapあたりでできそうなんだけど思いつかない…
(foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。

298:デフォルトの名無しさん
10/05/07 14:51:29
>>288
わざわざ作らんで

use File::Slurp;
my @list = read_file("list.dat");

しなよ。

299:デフォルトの名無しさん
10/05/07 14:58:34
>>297
> (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。

List::MoreUtilsになにかあるんじゃ

300:デフォルトの名無しさん
10/05/07 15:01:31
perl -e "print ((qw(foo bar baz),split(/,/, 'xxx,yyy,zzz'))[map{$_,$_+3}(0..2)]);
fooxxxbaryyybazzzz
あんまやるもんじゃないな

301:デフォルトの名無しさん
10/05/07 16:11:01
頭がおかしくなりそうだ
TMTOWTDIと言うけど、杉樽歯泳場猿画五都市と言う名言もあるし

302:デフォルトの名無しさん
10/05/07 16:17:03
>>297

use List::MoreUtils qw(zip);

$_ = '1,2,3';
push @result, {zip @{[qw(foo bar baz)]}, @{[split /,/, $_, 3]}};

303:デフォルトの名無しさん
10/05/07 16:23:58
>>299
おお! と思って List::MoreUtils の pairwise や mesh が使えるかと思って試してみました。
が、一旦変数に入れないとARRAYとして解釈してくれずダメでした…

#NG
print mesh qw(foo bar baz), (split(/,/, "1,2,3")); # compilation errors

#OK
my @array1 = qw(foo bar baz);
my @array2 = split(/,/, "1,2,3");
print mesh @array1, @array2;

304:デフォルトの名無しさん
10/05/07 16:25:12
>>302
入れ違いになりました。
素晴らしい。使わせていただきます。ありがとうございます。

305:デフォルトの名無しさん
10/05/07 16:35:48
>>297
>(foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
変数一つ作っていいならこんな関数かな

my @arr = ('foo', 'bar', 'baz', 1, 2, 3);
my $half = $#arr / 2;
my @result = map { +($arr[$_], $arr[$_ + $half + 1]) } (0 .. $half);

306:デフォルトの名無しさん
10/05/07 17:07:39
>>302
いったん無名配列への参照[]にして
それを@{}で、参照先の配列に戻して渡している
という理解でいいのかな?

307:デフォルトの名無しさん
10/05/07 17:10:34
>>306
そだね
URLリンク(perl-users.jp)

308:デフォルトの名無しさん
10/05/07 17:12:08
>>305
なんで3行で済ます方法を書いたの?

309:デフォルトの名無しさん
10/05/07 17:14:06
>>308
二行だろ

310:デフォルトの名無しさん
10/05/07 17:18:09
>>308
何揚げ足とろうとしてんのw

311:デフォルトの名無しさん
10/05/07 17:32:43
perl -e "print join',', map{(qw(foo bar baz))[$_],(split /,/, 'xxx,yyy,zzz')[$_]}(0..999);#十分に大きい値
foo,xxx,bar,yyy,baz,zzz
>>300よりはマシかなあ…

312:デフォルトの名無しさん
10/05/07 17:51:55
>>305
sub zip{ map { $_, shift @{$_[1]} } @{$_[0]} }
print zip [1,2,3],[4,5,6] ;



313:デフォルトの名無しさん
10/05/07 18:02:25
perl -e '@array = qw/xxx yyy zzz 1 2 3/; print map { $array[$_] => $array[$_ + @array / 2] } (0..($#array / 2));'

314:デフォルトの名無しさん
10/05/07 21:28:38
>>293
ヒント:シノラー

315:デフォルトの名無しさん
10/05/07 22:52:02
TwitterのAPI叩くにはどうすればいいですか
Net::Twitterとかじゃなくて、純粋にHTTP使ってその辺から学習したいのです

316:デフォルトの名無しさん
10/05/07 23:18:20
URLリンク(usy.jp)
サンプル集

317:デフォルトの名無しさん
10/05/07 23:51:12
use Net::Twitter;
役にたたなかった

318:デフォルトの名無しさん
10/05/08 19:37:45
win32でパスを含めて 256 バイト以上のファイル
URLリンク(www.namazu.org)

この問題ってもう解決されています?

319:デフォルトの名無しさん
10/05/11 00:00:10
Perlのファイル読み込みと配列格納について質問があります。
エクセルから出力した行列状態になっているcvsファイルをPerlに読み込ませて、
@a、@b、@cにそれぞれの行のデータを格納したいです。
なので、二次元配列のようなことをしないといけないと思うのですが、
Perlで二次元配列のような処理をするにはどうすればよいのでしょうか?
また行列状態になっているファイルを配列に格納する他の良い方法はありますでしょうか?
よろしくお願いします。



320:319
10/05/11 00:14:07
追記です。このような内容のファイルを扱っています。

1 Takehara Shinji 500 600 1300
2 Hatakeyama Takanori 569 795 1560
3 Kouki Kameda 785 889 2695
4 Daiki Kameda 758 784 9000
5 Tomoki Kameda 580 120 984

そして、左から4行目~6行目にある数値を縦に、
@a、@b、@cに格納し、
$a[0] を参照すると、500
$a[1] を参照すると、569
$b[0] を参照すると、600
$b[1] を参照すると、795
$c[0] を参照すると、1300
$c[1] を参照すると、1560
といった具合にしたいです。

321:デフォルトの名無しさん
10/05/11 00:16:24
>>319
・「perl 配列の配列」でググる
・「perl CSV」でググる

322:デフォルトの名無しさん
10/05/11 00:40:12
>>320

1 #! /usr/bin/perl
2
3 use strict;
4
5 my(@data, @array);
6 @data = (
7    '1 Takehara Shinji 500 600 1300',
8    '2 Hatakeyama Takanori 569 795 1560',
9    '3 Kouki Kameda 785 889 2695',
10    '4 Daiki Kameda 758 784 9000',
11    '5 Tomoki Kameda 580 120 984',
12 );
13
14 foreach(@data){
15    push(@array, [@{[split(/\s+/, $_)]}[3..5]]);
16 }
17
18 local $\ = "\n";
19
20 print $array[0][0]; #=> 500
21 print $array[1][0]; #=> 569
22 print $array[0][1]; #=> 600
23 print $array[1][1]; #=> 795
24 print $array[0][2]; #=> 1300
25 print $array[1][2]; #=> 1560


323:デフォルトの名無しさん
10/05/11 01:17:33
>>322
ありがとうございます。
外部からファイルを読み込む場合はどうすればよいのでしょうか?

324:321
10/05/11 01:45:17
>>323
だから「perl CSV」でググれと教えたのに。ググれば
”csvファイルを読み込んで配列の配列に変換に変換する”
URLリンク(d.hatena.ne.jp)
こんくらいすぐに出てくるだろ

325:デフォルトの名無しさん
10/05/11 01:51:03
>>322を改良できんレベルの人なら>>324のリンク先飛んでもイミフだろ

326:デフォルトの名無しさん
10/05/11 01:53:57
>>323
use IO::File;
my @data = IO::File->new('data.txt', 'r')->getlines;
chomp @data;

327:デフォルトの名無しさん
10/05/11 02:04:22
use File::Slurp;
my @csv = read_file('hoge.csv');
chomp @csv;

328:デフォルトの名無しさん
10/05/11 02:19:44
>>322
[@{[split(/\s+/, $_)]}[3..5]]

[(split /\s+/, $_)[3..5]]
のほうがいいよね。この場合に限れば /\s+/, $_ が無くてもよし。

つーかCSVなら最初からText::CSV(_XS)?使えばいいじゃんって話だけど。

329:デフォルトの名無しさん
10/05/11 02:46:24
>>328
おお、/\s/まで省略できるのか
初めて知った
ありがt

330:デフォルトの名無しさん
10/05/11 03:42:18
$_ = " foo\nbar\tbaz" としたとき、
split(/\s+/) だと ('', 'foo', 'bar', 'baz') が返るけど、
引数なしのsplit または split(" ") なら ('foo', 'bar', 'baz') になるってことだけ注意な。

331:デフォルトの名無しさん
10/05/12 01:12:21
HTTP通信するにはなんていうライブラリつかえばいいの

332:デフォルトの名無しさん
10/05/12 02:31:39
socks

333:デフォルトの名無しさん
10/05/12 13:31:19
えっ?

334:デフォルトの名無しさん
10/05/12 13:35:41
LWP

335:デフォルトの名無しさん
10/05/12 15:27:05
コードポイントからその文字を出力したいです。
#!/usr/bin/perl
use strict;
use utf8;
use Encode;
use Encode::Guess;

my $cp = "4FAE"; # 「侮」のコードポイント
my $packed = pack("S", $cp);

my $decoded = decode("utf-16be", $packed);
print $decoded, "\n";

my $decoded = decode("utf-16le", $packed);
print $decoded, "\n";

できないです。

336:デフォルトの名無しさん
10/05/12 15:58:56
pack("U", 0x4FAE) じゃだめなのか

337:デフォルトの名無しさん
10/05/12 16:16:02
0x4FAE または hex("4FAE") または "20398"

338:デフォルトの名無しさん
10/05/12 16:22:45
#!/usr/bin/perl
use strict;
use utf8;
use Encode;
use Encode::Guess;

my $cp = "4FAE"; # 「侮」のコードポイント
my $packed = pack("U", hex($cp));
print $packed, "\n";

ありがとうできました。でもwarningがでます。
$ perl cptest2.pl
Wide character in print at cptest2.pl line 9.

$

339:デフォルトの名無しさん
10/05/12 16:28:58
16進文字列からバイト列への変換が間違ってるな。

pack("S", $cp)じゃなくてpack("H*", $cp)だろ。

340:デフォルトの名無しさん
10/05/12 16:32:44
>>338
wide characterをいきなりprintするとそうなる。

encodeしてバイト文字列にしてからprintするか、
printする前に文字コード指定してレイヤつけとけ。

binmode STDOUT, ':encoding(utf-8)';

341:デフォルトの名無しさん
10/05/12 16:34:59
binmodeつけたら直りました。
ありがとうです。

342:デフォルトの名無しさん
10/05/13 12:34:03
URLリンク(www.cgarbs.de)
これをwindowsで動かせた人いますか?
perlのファイル1つだけのプログラムだからlinuxで動かすのは簡単だったんだけど
windowsではうまく動いてくれない

343:デフォルトの名無しさん
10/05/14 13:21:02
文字のバイトコードを得るほうほうを教えてください!
たとえば、a から 97 を得るようなことってできますか??

344:デフォルトの名無しさん
10/05/14 13:23:28
ord("a")

345:デフォルトの名無しさん
10/05/14 13:26:10
ありがとう!

346:デフォルトの名無しさん
10/05/15 03:08:54
perlで文字をprint等で出力するとき、特定の行で改行をして出力するというようなことってできますか?

347:デフォルトの名無しさん
10/05/15 03:32:34
できるよ安心して

348:デフォルトの名無しさん
10/05/15 03:44:17
>>347
安心した
やり方を教えてちょ

349:デフォルトの名無しさん
10/05/15 04:42:20
何だよ「特定の行」って

350:デフォルトの名無しさん
10/05/15 06:11:15
質問の意図するところが分からない。このうちのどれか?
use strict; use warnings; print "is\nthis\nunko?\n";

use strict; use warnings; print << "END_OF_UNKO";
this
is
unko!
END_OF_UNKO

use strict; use warnings; use HTML::Template;
my $what_is_this = join "", <DATA>;
my $t = HTML::Template->new( scalarref => \$what_is_this );
$t->param('var', "was");
print $t->output;
__DATA__
this
<TMPL_VAR name="var">
unko!

351:デフォルトの名無しさん
10/05/15 06:50:15
>>348

use IO::File;

my $fh = IO::File->new('hoge.txt', 'r');

while(my $line = $fh->getline){
print $line;
print "\n" if $line =~ /hoge/;
}

こんな漢字?

352:デフォルトの名無しさん
10/05/15 09:22:29
$. == 行番号 とか。

353:デフォルトの名無しさん
10/05/15 11:21:19
perlで作った掲示板の連続投稿を制限する方法を教えてください。
一定時間が経過するまで再投稿できないようにしたいです。


354:デフォルトの名無しさん
10/05/15 11:59:34
投稿者のIDに対して最後の投稿時間を記録する

355:デフォルトの名無しさん
10/05/15 12:24:13
小規模ならグローバルでもいいんじゃないの?

# 30秒経過してない場合returnする
return if $g_last_post + 30 > time;
$g_last_post = time;


356:デフォルトの名無しさん
10/05/15 14:35:57
>>353
IPのログはとってんだろ?
そこから判定すりゃいい
samba24みたいな手にするって方法もあるな
ちょっと技術がいるかも知れないが

357:デフォルトの名無しさん
10/05/15 14:55:21
普通はそんなめんどいことしないでクッキー食わせて判定だと思うぜ

358:デフォルトの名無しさん
10/05/15 15:04:37
ログは巨大だからなあ
自前でテーブル持つ方が軽い

359:デフォルトの名無しさん
10/05/15 15:21:54
いやだから普通はクッキーだろっての

360:デフォルトの名無しさん
10/05/15 15:55:01
↑バカは喋るな

361:デフォルトの名無しさん
10/05/15 15:58:24
>>359
クライアントが書き込み後にクッキー捨てたらアウトだと思うんだがそうでもないのか
もうちょっと詳しく

362:デフォルトの名無しさん
10/05/15 16:01:51
>>349-352
長いテキストがあり、100文字目ごとに改行を入れるということです。
分かりにくくて申し訳ありませんでした。

363:デフォルトの名無しさん
10/05/15 16:17:33
2chもクッキーだな

364:デフォルトの名無しさん
10/05/15 16:27:54
>>362
Text::LineFold

>>353,354-359,361,363
板違い URLリンク(pc11.2ch.net)

365:デフォルトの名無しさん
10/05/15 16:29:03
一足遅かったか

>>362
>>3
URLリンク(www.din.or.jp)
URLリンク(search.cpan.org)

>>353
△▲ WebProg 初心者の質問 Part22 ▼▽
スレリンク(php板)

366:デフォルトの名無しさん
10/05/16 21:25:10
funcA();
if(hoge){ funcAErr(); }
else
{
 funcB();
 if(fuga){ funcBErr(); }
 else
 {
  funcC();
  if(fuga){ resultA(); }
  else{ resultB(); }
 }
}

こんな感じで事前処理にこけたら弾き、を繰り返して最後の処理で結果Aか結果Bのいずれかを返す、
と言ったコードがあるんですが、これをもっとPerlらしくシンプルに書きたいんだがどう書けばいいだろう……。
(ifネストが実際には3階層ではなく20階層くらいあります)


367:デフォルトの名無しさん
10/05/16 21:43:55
>>366
funcA() や funcB() の戻り値は無いのかとか、hoge や fuga が何を判定してるのかとか、
funcAErr() でなく funcErr('A') じゃダメなのかとか、エラー処理後に戻ってくる (if then else
で括る) 必要があるのかとか、Perlらしさ以前の問題だと思う。

368:デフォルトの名無しさん
10/05/16 21:45:08
こんな感じの改造すれば良いんちゃう?
my @tasks = (
 sub { () }, # <= funcA() とかが入る。
 sub { () },
 sub { () },
 sub { () },
 sub { () },
 sub { () },
 sub { 42 }
);

my $argument ;
for ( @tasks ){
 my $flag = $_->( $argument ) ;
 next if ! $flag ; # エラー処理やりたきゃ、ここを真面に。
 print qq{${flag}hoge\n} ;
 last ;
}


369:デフォルトの名無しさん
10/05/16 22:25:07
>>366
エラー処理はfuncA()、funcB()の中で例外発生させて
全体をevalブロックでくくり、例外をキャッチして処理
エラー以外の分岐は適当に処理をブロックでくくり、last、redoなどでコントロール

eval {
 funcA();
 funcB();
 {
  funcC();
  if (fuga) { resultA(); last }
  resultB();
 }
};
if ($err = $@) {
 $err->A ? funcAErr() :
 $err->B ? funcBErr() :
 $err->C ? funcCErr() : Err();
}

370:デフォルトの名無しさん
10/05/16 22:49:10
メールを受信して、添付の画像ファイルを画像処理し、サーバに保存したいと考えています。
メール受信時に本プログラムにメールを渡すようにメールサーバは設定しています。
以下ソースの関係している部分です。
----mailimage.pl-----
my $parser = MIME::Parser->new;
#ファイルの一時保存場所を指定
$parser->output_dir('./tmp');
$filename='';
#標準入力からメールを取得
my $entity = $parser->parse(*STDIN);
#添付ファイルがある場合のみ処理
if($entity->is_multipart){
#パートの数(本文と添付ファイルの合計数)
$count = $entity->parts;
#メール本文以外(添付のみ)を取り出し(本文は0番目のため、一番目から取り出し)
for($i = 1; $i < $count; $i++){
#ファイル名を含むパスを取り出し
$path = $entity->parts($i)->bodyhandle->path;
#ファイル名を取り出し
$filename =time. (fileparse($path))[0];
$filenameglobal=$filename;
`./out1 $path outputimg/$filename.bmp`;
}
}
out1というプログラムが画像処理を行うファイルで、第一引数に入力を、第2引数に出力先をとるように作成しています。
mailimage.pl < sample.eml
といった具合に、ローカル環境でeメールファイルを渡してやった場合は正常に動作します。
しかし、実際にメールを受信するとtmpファイルへの保存は行われるのですがout1で得られるべき出力画像が得られません。
どうやら、tmpフォルダに保存される前にout1を呼び出しているようで、入力がない状態になってしまっているようです。
解決策のご提示をよろしくお願いいたします。
また、一度ファイルに保存することなく直接メモリ上で受け渡す方法などもご提示いただけると幸いです。

371:デフォルトの名無しさん
10/05/17 01:35:34
perl から任意のアプリ(例えばメモ帳)を起動したいんだけどどう書けば良いのでしょうか?

372:デフォルトの名無しさん
10/05/17 01:49:44
perl -e "`notepad`

373:デフォルトの名無しさん
10/05/17 22:55:18
cpan> install XML::Atom
*********いろいろ展開されて

Please download the file manually, save it to a directory in %PATH% (e.g.
C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to
that directory, and run "Nmake15.exe" from there; that will create the
'nmake.exe' file needed by this module.

You may then resume the installation process described in README.

-------------------------------------------------------------------------------
Warning: No success on command[C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site]
MIYAGAWA/XML-Atom-0.37.tar.gz
C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site -- NOT OK
Running make test
Make had some problems, won't test
Running make install
Make had some problems, won't install
Failed during this command:
MIYAGAWA/XML-Atom-0.37.tar.gz : writemakefile NO 'C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site' ret
urned status 512

cpan>
と表示されてしまいました。とりあえず、nmake.exe はダウンロードしました。
これからどうすればいいでしょうか?

374:デフォルトの名無しさん
10/05/18 00:12:07
>>373
今使ってるperlをアンインストールしてActivePerlの最新版をインストールし、PPMを使え

375:デフォルトの名無しさん
10/05/18 00:23:08
うちcpanが成功した試しがないわ
ppmならokだけど

376:デフォルトの名無しさん
10/05/18 05:28:00
XS系はことごとく失敗する気がする…
特にXMLやHTMLのパーサー関連は入らん at Ubuntu

377:デフォルトの名無しさん
10/05/18 06:13:44
まさかbuild-essential入れてないとかじゃないよな

378:デフォルトの名無しさん
10/05/18 06:45:12
XML-Atomはppmに無いからめんどくさいんだよな
だから俺は使ってない
あとこいつマルチだな

379:デフォルトの名無しさん
10/05/18 08:46:53
今ならStrawberry Perl入れた方が楽じゃない?
XML::Atomもすんなり入ったよ

380:デフォルトの名無しさん
10/05/18 08:55:06
そもそもwindows系OSでperl使うのがすでに茨の道とも言える

381:デフォルトの名無しさん
10/05/18 10:03:01
なんで?

382:デフォルトの名無しさん
10/05/18 11:48:53
>>378
リポジトリにこれ加えとけ。
URLリンク(trouchelle.com)

383:デフォルトの名無しさん
10/05/18 12:20:10
elseifでなく何故elsifなんですか?

384:デフォルトの名無しさん
10/05/18 13:26:56
母音が続くのが気持ち悪いから

elifじゃないのと聞かれたら解答に窮するが、CPPはelifなんだよな
文化によって多少違いはあるが、やはり、母音が続くのが気持ち悪いんだと思う

385:デフォルトの名無しさん
10/05/18 13:55:38
いっそのことelfでいいじゃん。
短いし。

386:デフォルトの名無しさん
10/05/18 15:33:01
最近プログラミングの勉強を始めました

print "hello world";

と書いてhello.plで保存し、ターミナルで

perl hello.pl

と入力するのはわかったんですが、hello.plはどこに保存すればいいのですか?
環境はMac OS Xです

387:デフォルトの名無しさん
10/05/18 16:10:27
>>386
好きな場所

388:デフォルトの名無しさん
10/05/18 16:28:15
>>386
今自分がいる場所におけばいい
違う場所に置きたいならフルパスで指定すれば実行できる

389:デフォルトの名無しさん
10/05/18 16:41:23
>>382
サンクス
つか、ppmguiにリポジトリのサジェストなんてあったんだな
そこにも載ってたわ
重ねてサンクス

390:デフォルトの名無しさん
10/05/18 17:56:24
>>386
perlの前にターミナルの使い方を覚えるためのBash入門を読んだ方が良いかも。

391:デフォルトの名無しさん
10/05/18 18:42:40
それは的外れなアドバイス

392:373
10/05/18 21:37:27
ATOM::XML をWinXP/Active Perl に入れたい
なにかヒントありますか?
>>374
>>375
>>379
ストロベリー入れましたけど、Activeパールと同じエラーです。
(nmake をダウンロードして、ダウンしたパッケージをmake して、
それから、再度ACTIVE Perl で,ATOM::XMLしたときとです。
やはり、パッケージが問題なのかな?
cpan> install ATOM::XML
Fetching with LWP:
URLリンク(cpan.strawberryperl.com)
Fetching with LWP:
URLリンク(cpan.strawberryperl.com)
Fetching with LWP:
URLリンク(cpan.strawberryperl.com)
Creating database file ...

Gathering information from index files ...
Populating database tables ...
Done!
Warning: Cannot install ATOM::XML, don't kn
Try the command

i /ATOM::XML/

to find objects with matching identifiers.

393:デフォルトの名無しさん
10/05/18 21:44:02
現在 WinXP上にActivePerlが入っています。StrawberrryPerlを入れて共存できるのでしょうか?

394:デフォルトの名無しさん
10/05/18 21:49:59
エラーメッセージくらい読めよ

395:デフォルトの名無しさん
10/05/18 21:52:02
普通に考えるとパッケージ名ってAtom::XMLもしくはXML::Atomだからでは

396:373
10/05/18 21:57:06
とりあえず、
install XML::Atom::Feed
とすると、したみたいになった。これってATOM::XML ってインストールできたのかな
Prepending C:\strawberry\cpan\build\XML-Atom-0.37-H4btN8/blib/arch C:\strawberry
\cpan\build\XML-Atom-0.37-H4btN8/blib/lib to PERL5LIB for 'install'
Installing C:\strawberry\perl\site\lib\XML\Atom.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Base.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Category.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Client.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Content.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Entry.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\ErrorHandler.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Feed.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Link.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Person.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Server.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Thing.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Util.pm
Appending installation info to C:\strawberry\perl\lib/perllocal.pod
MIYAGAWA/XML-Atom-0.37.tar.gz
C:\strawberry\c\bin\dmake.EXE install UNINST=1 -- OK
cpan>


397:デフォルトの名無しさん
10/05/18 22:13:16
perlで添付ファイル取得して、それをopencvに渡して結果を保存したいんだが、出来ない。
ローカルでemlファイル読み込ませるといけるのに、メール受信をトリガに起動するとだめだ・・。
どうして?

398:デフォルトの名無しさん
10/05/18 22:32:58
>>396
OKってかいてありますやん

心配なら
$ perldoc XML::Atom

399:デフォルトの名無しさん
10/05/18 22:34:23
>>396
XML::Atom と ATOM::XML は全く別のモジュールだ。
(存在すればの話しだが)
お前さんが、いくら XML::Atom を入れたとしても、
ATOM::XML は永久に入らん。


気持悪いったらありゃしない。

400:デフォルトの名無しさん
10/05/19 12:22:56
アハハハ

401:デフォルトの名無しさん
10/05/19 14:46:33
たとえば、[[:ascii:]]から'<'を除いた文字クラスを表わすにはどうしたらいいでしょうか?

402:デフォルトの名無しさん
10/05/19 18:51:09
もともと入ってないやん

403:デフォルトの名無しさん
10/05/21 21:53:00
数百のファイルを処理するPerlスクリプトがありまして、それがシーケンシャルに処理してて
クソ時間がかかるため、マルチスレッドでやらせようとPerlについて勉強しています。
で、いまんとこ、セマフォで並列処理数を制御し、joinするためだけのスレッドを動かして
かたっぱしからjoinするようにしています。おかげで処理時間は半分以下になったのですが、
これを添削していただけないでしょうか。もっとエレガントなやり方があれば教えていただきたいです。
よろしくおねがいします。

#!/usr/bin/perl
use strict;
use File::Basename;
use File::Path;
use threads;
use threads::shared;
use Thread::Semaphore;

use Codemap;
use SVG;

my $concurrency = 5;
my $semaphore = Thread::Semaphore->new($concurrency);
my $exitflag :shared = 0;
my $jointhreads = threads->new(\&joinThreads);

while (@ARGV) {
my $orig_svg = shift(@ARGV);
$semaphore->down;
threads->new(\&doSplit, $semaphore, $orig_svg);
}
$exitflag = 1;
$jointhreads->join;
exit 0;


404:403のつづき
10/05/21 21:53:56

sub joinThreads {
until ($exitflag) {
foreach my $thr (threads->list) {
if ($thr->tid and !threads::equal($thr, threads->self)) {
$thr->join;
}
}
print "\nThreads joined.\n";
}
}

sub doSplit {
my $semaphore = shift;
my $orig_svg = shift;

my $svg = new SVG($orig_svg);
$svg->setdumpdir("work.d");
if ($svg->modtime() > $svg->splittime()) {
$svg->dump();
print STDERR " $svg->{filename} : splitted\n"
} else {
print STDERR " $svg->{filename} : SKIP\n"
}
$semaphore->up;
}


405:デフォルトの名無しさん
10/05/22 14:07:11
UTF8の~をshift_jis(cp932)に変換して出力するとエラーが出てしまいます。
解決策があれば教えていただきたいです。
環境はWindows 7 64bitとActivePerl v5.10.1 64bitです。

use utf8;
binmode STDOUT, ":encoding(cp932)";
print "昨日は10時~6時まで寝た。\n";

D:\>test.pl
"\x{301c}" does not map to cp932 at D:\test.pl line 3.
昨日は10時\x{301c}6時まで寝た。

406:デフォルトの名無しさん
10/05/22 14:20:39
D:\>test.pl

何故こんなところで作業しているのか

407:デフォルトの名無しさん
10/05/22 14:54:09
「~」には
FULLWIDTH TILDE (FF5E)
WAVE DASH (301C)
の二種類がある。

408:デフォルトの名無しさん
10/05/22 14:57:40
~の厄介さはMacを使ってるとよく分かる

409:デフォルトの名無しさん
10/05/22 16:10:32
macでなくても~は厄介

410:デフォルトの名無しさん
10/05/22 16:13:53
Macだとプログラムとか使わなくても
普段から~が厄介になる

411:デフォルトの名無しさん
10/05/22 16:15:49
え?

俺は生粋のマカーだけど、厄介さが全然分からん。
何かトラブるっけ? "~"って。
Mac<=>Winのデータ交換とかの話し?


412:デフォルトの名無しさん
10/05/22 16:21:41
Macで~と書き込んだら
Winだと逆向きの波線に見えたり
最近は大丈夫な気はするが

413:デフォルトの名無しさん
10/05/22 16:31:53
~が厄介なんて、OS9時代の話だろ。
昔から機種依存文字問題とか、今はUTF8-macとUTF-8とか
もっと厄介なモンがあるから。


414:デフォルトの名無しさん
10/05/22 16:54:16
OSXでの話だが

415:405
10/05/22 17:06:03
皆さんレスありがとうございます。

>>405はmeadowから打ち込んだ~は\x{301c}となり、
notepad等から打ち込んだ~は\x{ff5e}になる事が原因で表示に失敗していました。
\x{301c}はshift_jisでは表示に成功しcp932では失敗しました。
\x{ff5e}はcp932では表示に成功しshift_jisでは失敗しました。

どうやらeucとsjisの~はutf8の\x{301c}に対応していて
cp932の~はutf8の\x{ff5e}に対応しているようでした。
なので例えばeucの~をutf8に変換し、それをcp932に変換すると失敗するようです。

挙動がおかしいと思った元のプログラムではネット上にあるeucのページを取ってきて
utf8に変換し出力時にcp932に変換していたので上記の理由で文字化けしていた様です。
そこでeucをutf8に変換した際に\x{301c}を\x{ff5e}に変換するようにしました。
$utf8data =~ tr/\x{301c}/\x{ff5e}/;
そうしたところprintした際に"\x{301c}" does not map to cp932というエラーも出ず、無事~が表示されるようになりました。

416:デフォルトの名無しさん
10/05/22 17:10:30
意味不明

417:デフォルトの名無しさん
10/05/22 19:23:59
>>405
use utf8は「フツーは使うな」とCPANに書いてあった気がする。
Windowsを呪いながらEncode使え。

#!perl
use Encode;

my $msg = "昨日は10時~6時まで寝た。\n";
Encode::from_to($msg, 'utf8', 'cp932');

print $msg;

418:デフォルトの名無しさん
10/05/22 19:39:43
>use utf8は「フツーは使うな」
理由は?

419:デフォルトの名無しさん
10/05/22 20:34:20
>>417
>use utf8は「フツーは使うな」とCPANに書いてあった気がする。
どこに書いてあったの?聞いたことない

420:デフォルトの名無しさん
10/05/22 21:01:51
> Do not use this pragma for anything else than telling Perl that your script is written in UTF-8.
もしかしてこれの事か?

421:デフォルトの名無しさん
10/05/22 21:08:00
>>417
そのEncodeの作者が
>スクリプトはUTF-8で書き、use utf8;するのがモダンPerlのあり方です。
って言ってるけどな。
URLリンク(blog.livedoor.jp)

422:デフォルトの名無しさん
10/05/22 22:19:22
文字列の切り取りに関して質問があります。
$a="aho";
$b="baka";
$str="ahomanukebaka";
$strには$aと$bで"manuke"という文字が挟まれています。
このとき$strからmanukeだけを切り抜くにはどうすればよいでしょうか?

423:デフォルトの名無しさん
10/05/22 22:24:54
 substr($str, length($a), length($str)-length($a.$b));

424:デフォルトの名無しさん
10/05/22 22:48:06
>>422
my $a1 = "aho";
my $b1 = "baka";
my $str = "ahomanukebaka";

$str =~ s/$a1(.*)$b1/$a1$b1/;

warn $str; # ahobaka
warn $1; # manuke

425:デフォルトの名無しさん
10/05/22 23:01:54
失敗してるのに前の$1を読んでしまう

426:デフォルトの名無しさん
10/05/22 23:16:31
>>425
あぁ、ごめん。本当はifとかやるけどmanukeが必要なのかどうなのかわからなくて
とりあえず$1に入ってるよって言いたかった

427:デフォルトの名無しさん
10/05/22 23:22:02
>>424
できましたありがとうございます!

428:417
10/05/23 01:13:47
>>420
それだ。
WWW::Mechanizeでcp932受け付けんからEncode::decode_utf8($massage)とかやってたのに、
use utf8だけで済んだのか・・・・クソアホみたいだわorz


429:デフォルトの名無しさん
10/05/23 13:00:16
正規表現のグルーピングについて質問です
繰り返し表れる対象をグループ化したいのですが良いやり方ありますか?
gオプション付けたら行けるかと思ったらダメだった。

my $str = << 'END';
aba

aca

ada

END

$str =~ m{(a[^a]a)\n\n}g; # これだと初めの対象にしかマッチしない

430:デフォルトの名無しさん
10/05/23 13:23:18
>>429
g(global?)オプションだけでなく
m(multi line?)オプションもいるんじゃなかったっけ

431:デフォルトの名無しさん
10/05/23 13:27:20
>>429
こう?

my @matches = $str =~ m{(a[^a]a)\n\n}g;

432:デフォルトの名無しさん
10/05/23 13:32:54
>>430
$str =~ m{(a[^a]a)\n\n}mg;
これも試したけどダメだったんだよね

>>431
おぉ。いけました。
ちなみに=と=~を一緒に書くとわかりにくいので別にする方法ってありますか?
普通のマッチの場合、下みたいに分けたりしてるのだけどそういう方法があれば教えてください
warn $1 if $str =~ m{(a[^a]a)\n\n}g;

433:デフォルトの名無しさん
10/05/23 13:41:44
>>432
ifをwhileに変えるだけ

warn $1 while $str =~ m{(a[^a]a)\n\n}g;

434:デフォルトの名無しさん
10/05/23 13:59:57
gオプションが付いても付かなくても
正規表現に括弧がひとつしかないから、$2と$3は未定義。
ループを回すたびに$1の内容が変わる。

435:デフォルトの名無しさん
10/05/23 14:09:01
my @matches;
push @matches, $1 while $str =~ m{(a[^a]a)\n\n}g;

436:デフォルトの名無しさん
10/05/23 14:25:05
while m//g とか while each %hash って気持ち悪いな

437:429
10/05/23 14:34:43
>>433-435
なるほど!ありがとうございます。while使うのかぁ。知らなかった。
perldoc perlreに書いてあるのかなぁって探してみたら書いてあった。勉強になりました。
@matches = ( 'foo' =~ m{ o? }xg );

or

print "match: <$&>\n" while 'foo' =~ m{ o? }xg;
せっかくなのでついでにもう一つ質問ですが、>>430みたいにm付けた場合もやり方がありますか?

438:デフォルトの名無しさん
10/05/23 14:59:38
>>437
ないと思う
mは^と$の意味が変わるだけだった気がする

439:デフォルトの名無しさん
10/05/23 15:51:17
なんか改行コードだけ特別扱いなんだよな

440:デフォルトの名無しさん
10/05/23 22:00:35
Perlのif文で質問があります。とあるデータ文書からPerlを使って情報を抜き出しているのですが、
情報1、情報2というのが存在して、情報1にヒットしたときは、情報1と情報2を出力、
情報1にヒットしないときは、無視というような判定をするにはどうすればよいのでしょうか?

441:デフォルトの名無しさん
10/05/23 22:09:09
perlに関係ないような気がするけど、こういう意味じゃないの?
if (情報1にヒット) {
  print 情報1;
  print 情報2;
}

442:デフォルトの名無しさん
10/05/23 22:12:57
>>441
データ文書の情報1と情報2が別々のところに記載されていてそれができないのです。
元データ文書を晒すので少々お待ちください。

443:デフォルトの名無しさん
10/05/23 22:24:18
両方揃ってから判断するのだ

444:デフォルトの名無しさん
10/05/23 22:32:12
このデータ文書ファイルです。
URLリンク(uploader.moe.hm) パス:perl

内容として作家情報と執筆した作品の情報が記載されています。
このファイルでは3名しか載っていませんが、実ファイルは世界中の作家情報が載っているので、
数万単位で同じような情報が載っています。
この中から、SCHOOLの行にUOFTOKYOと書いてある作家の作品だけを抜き出して出力できるようにしたいです。

445:デフォルトの名無しさん
10/05/23 22:35:10
DB_FileとかDBI使えばいいのに……Plain/textとはまた面倒な

446:デフォルトの名無しさん
10/05/23 22:53:34
>>444
schoolがuoftokyoの作家の名前を抜き出し、
その名前から違う場所にあるデータを抜き出して出力したいってこと?
大して>>441とやること変わらない気がするな
if (情報1にヒット) {
  作家名から情報2を取得;
  print 情報1;
  print 情報2;
}
こうなるだけじゃない?

447:デフォルトの名無しさん
10/05/23 22:57:06
>>446
仰る通りです。
コードを書いているのですが、情報1にヒットした後、
情報2を書き出してやると、UOFTOKYO以外の作家作品情報も出力されてしまい、
どうしていいのか分からない状態です。

448:デフォルトの名無しさん
10/05/23 23:13:39
>>447
情報2のデータの取得方法がおかしいんじゃいの?
そっちはどういうデータなの?

449:デフォルトの名無しさん
10/05/23 23:14:43
>>448
情報2はWORKSとENDの間の情報です。

450:デフォルトの名無しさん
10/05/23 23:33:20
現在書いているコードも載せておきます。

URLリンク(uploader.moe.hm) パス:perl

451:デフォルトの名無しさん
10/05/23 23:41:07
while (<IN>){
$line = $_;
なんだこれ

452:デフォルトの名無しさん
10/05/23 23:48:02
ああー、そんなこと書いたこともあった

453:デフォルトの名無しさん
10/05/24 00:19:55
テキストファイルだと>>444のようにやるのは無理なのでしょうか?

454:デフォルトの名無しさん
10/05/24 00:22:31
>>449
こんな感じかな。ネストがちょっと気持ち悪くてどうにかしたいけど
URLリンク(codepad.org)

>>450にソース上がってたのね。見てなかったわ

455:デフォルトの名無しさん
10/05/24 00:37:05
綺麗なコード書くなぁ
人の書いたコードは難しくて読めないことが多い俺にはちょうど良い読み易さだった

456:デフォルトの名無しさん
10/05/24 00:53:43
my $name ;
while(<>){
 $name = $_ if /^NAME/ ;
 next if ! ( /UOFTOKYO/ .. /^ID/ || eof );
 print $name and undef $name if defined $name ;
 next if !(/^WORKS/ .. /^END/ ) ;
 print ;
}
細かい所は知らん。


457:デフォルトの名無しさん
10/05/24 00:57:51
× /UOFTOKYO/ .. /^ID/ || eof
◯ /UOFTOKYO/ .. /^END/


458:デフォルトの名無しさん
10/05/24 01:01:27
>>456
おぉ。..ってそういう時も使えるのか。フラグ要らなかったな

459:デフォルトの名無しさん
10/05/24 02:00:33
へぇ、こんな使い方が出来るんだ。
30分位調べてようやく意味が理解出来た。

参考にした物
URLリンク(ja.wikibooks.org)
URLリンク(books.google.co.jp)

460:デフォルトの名無しさん
10/05/24 07:33:10
正規表現に必ずxmsつける人ははじめて見たけど流行ってんの?
個々の意味はわかるけどこうしとくといい理由とかあるんだろうか??

461:デフォルトの名無しさん
10/05/24 07:38:13
>>460
Perlベストプラクティスに書いてあった癖で書いちゃう
普通は気にしなくていいと思う

462:デフォルトの名無しさん
10/05/24 10:06:39
>>461
気になるのでどういう理由でそう書いてあったか憶えてたら教えてください。
本屋に行くにせよ尼かなんかでポチるにせよ週末になっちゃうので待てないw

463:デフォルトの名無しさん
10/05/24 17:45:34
googleのアカウント持ってるなら、
URLリンク(books.google.co.jp)正規表現&f=false
で、255ページから読め


464:デフォルトの名無しさん
10/05/24 17:47:37
あ、URLエスケープ忘れてた。
URLリンク(books.google.co.jp)

465:デフォルトの名無しさん
10/05/24 19:06:38
これ全ページ無料で読めるんだね、すごい。
売上が下がるかもしれないのにオライリージャパンは許容してるの?

466:デフォルトの名無しさん
10/05/24 19:11:40
多分許容してない>オライリー・ジャパン
アメリカでは既に訴えられて裁判になり和解まで行ってるようだけど日本は分からん。
訴えられるまでやりますって感じかもね。
本は実際に手にとって読みたい人がいるからこれは良い宣伝になり売上が伸びる。
ってのもあるだろうけど、これだけで済ます人も多そうだ。

467:デフォルトの名無しさん
10/05/24 19:15:03
よく見るとわかるけどたまに表示されないページがあるよ。

468:デフォルトの名無しさん
10/05/24 19:15:18
って左下に「O'Reilly Japanの許可を受けてページを表示しています. 」って書いてあるじゃねーかw

469:デフォルトの名無しさん
10/05/24 22:51:55
少なくともおれの場合は中身が見られることで洋書を買う量が増えたよ。
見るのはgoogleより米amaの方が多いけど。

470:デフォルトの名無しさん
10/05/24 23:12:24
おおー
こんなのが只で読めるとは

471:デフォルトの名無しさん
10/05/24 23:34:58
レイアウト解説本に載ってるのって、俺からすると読みづらいことばっか書いてるんだ
コメントが行区切りの役果たしてるんだから空白行いらんだろ、かえって関数が盾に間延びする

よく考えたらほとんどの環境でPerlの場合コメント着色されないんだっけ・・・区切りの機能果たさないなw

472:デフォルトの名無しさん
10/05/24 23:51:08
これ買うかどうか迷ってたけど欲しくなったわ

473:デフォルトの名無しさん
10/05/25 00:52:16
>>467
たまにどころか途中から全部仏陀義理じゃねーかw

474:デフォルトの名無しさん
10/05/25 23:02:04
そうなのか
まだ頭の方だからたまに飛ぶくらいでかなり役立ってる

475:デフォルトの名無しさん
10/05/26 13:48:27
Perlに匹敵するモジュールがそろった言語って他にありますか?
具体的には
・ActiveDirectoryの操作(Net::LDAP)
・FTPs
・WWW::Mechanize
・DBI
・Net::DNS
・GD
・関数のpack
このくらいはせめて欲しいのですが・・・

476:デフォルトの名無しさん
10/05/26 14:06:24
定番的なものはrubyにもpythonにも(そして多分schemeやHaskellにも)たいてい
相当するようなものはあるので好きなの使えばいいとおもうけど、そんなのは
それぞれのスレに行って聞けよ。でもわざわざ他の言語使わんでもperlでいい
んじゃね?

477:475
10/05/26 14:27:29
>>476
ありがとう。
Perlしか分からないので、Perlで書いたものを他に移植することで
勉強はじめようかと思いまして。
とりあえずスクリプト言語はPerlを嫁にして、
C/C++、Javaあたり覗いてきます。


478:デフォルトの名無しさん
10/05/26 17:00:41
URLリンク(usamimi.info)
にあるような感じで縦書きテキストビューワーを作っています。
引き数として与えられるファイルが、
テキストファイルなのかバイナリファイルなのか判定したいのですが、
-T でのテキストファイル判定はその判定方法から
UTF-8以外の日本語文字コードでは上手く機能しないらしくて困ってしまいました。
テキストファイルかバイナリファイルかを判定する良い方法は無いでしょうか?


479:デフォルトの名無しさん
10/05/26 19:28:28
Encode::guessで判定して、decodeするときにFB_CROAKを指定して
エラーにならなきゃOKとか?

480:デフォルトの名無しさん
10/05/26 19:29:25
guess_encoding()使ってるみたいだから、guessに失敗したら中断(現行コードのまま)でえーんでないの?
そもそも -T の精度も疑わしいし、ましてやWindows環境だとマジックナンバー照合による判定は無理なんでは?

判定精度を上げたいなら
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/;
  ↓
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp cp932/;

481:デフォルトの名無しさん
10/05/26 20:21:46
全走査して\0が無ければテキストファイル。でもutf16/32は勘弁な。

482:デフォルトの名無しさん
10/05/26 21:11:04
>>478
テキストビューワなら、常にテキストと仮定しちゃえばいいんじゃないの?

483:デフォルトの名無しさん
10/05/26 21:55:51
>>482
まあ普通はそうだよなぁ
判定するようなエディタは少ない

484:478
10/05/26 23:48:34
>>479-483
レスありがとうございます。

guess しに行く前にどうにか判定出来ないかと
都合の良い事を考えていたのですけども、
>>482さんや>>483さんの仰るように常に対象はテキストファイルだと仮定して、
>>480さんのご指摘の通り現行コードのままにする事にしましす。

>>480
cp932 の事をうっかり忘れていました。
寧ろ shiftjis より cp932 の方が重要なのに…。
ご指摘ありがとうございます。


485:デフォルトの名無しさん
10/05/27 09:17:39
shiftjisとcp932の両方を候補に入れるとほとんどの場合区別がつかなくて
Encode::Guess->guessがエラー返すと思うのだが。

おおざっぱにいうとEncode::Guessの判定アルゴリズムは

1行ずつ候補のencodingでdecodeしていって、候補が1つになったら
それを返す。候補がなくなったり複数残ったらエラー(ただしasciiが
最終候補に含まれていたらascii)

だからね。

486:478
10/05/27 09:36:54
>>485
その通りなのです。
事実上、shiftjis よりも cp932 のテキストファイルを扱う方が圧倒的に多いと思って、
より現実に即して、判別候補の shiftjis を cp932 に変更しました。


487:デフォルトの名無しさん
10/05/27 09:49:56
どっちを扱うのが多いかより「~」などのunicodeへのマッピングが異なる文字を
どうしたいかの方が重要なきがする。

488:デフォルトの名無しさん
10/05/27 12:31:50
俺も縦書きやったことあるけど
unicodeに縦書き用のものがマッピングされてない約物({}…~など)は
回転するしかなくて、そのなかでも波ダッシュは鬼門だったな。

ちなみに《》()「」『』【】〔〕の約物については縦書き用の文字が用意されてる。

489:デフォルトの名無しさん
10/05/27 14:39:56
日本語フォントには縦書き用のグリフが含まれるからそれを使えばいいんだよ

490:デフォルトの名無しさん
10/05/27 19:23:42
EncodeでUTF-8にして扱うなら波ダッシュは全角チルダになっちゃうんじゃないの?


491:デフォルトの名無しさん
10/05/28 10:03:55
>>490
いやそれはおかしい。


492:デフォルトの名無しさん
10/05/28 19:01:24
上の方に出てたけどeucとsjisの~をutf-8に変換するとWAVE DASH (301C)になり
cp932の~をutf-8に変換するとFULLWIDTH TILDE (FF5E)になるみたいだね。

493:デフォルトの名無しさん
10/05/31 16:35:35
20年前に少しかじったBasic言語しか知らないおらが、突然Perlを学ぶことに目覚めました。
たぶん初めてのPerlという良書のおかげです。
C言語とかJavaとかPythonとか色々学ぼうとして挫折を繰り返していました。

いきなりですが、質問があります。お教えください。

#!/usr/bin/perl
print "Please enter a number \n";
chop($number=<STDIN>);
while($number=~/|\D/){print "Please enter only a number! \n";chop($number=<STDIN>);}
以下数字が入力された場合に続く。

上記のように、何も入力されなかった(改行のみ)り、数字以外が入力されたときに
エラーメッセージを出す方法を教えてください。

上記ではおそらくwhile($number=~/|\D/)の正規表現が間違っていると思います。
また、上記目的を叶えるためのエレガントな方法があればお教えください。

494:デフォルトの名無しさん
10/05/31 17:09:38
$number!~/^\d+$/
かねえ

#!/usr/bin/perl
print "Please enter a number \n";
while(1){
chop($number=<STDIN>);
last if $number=~/^\d+$/;
print STDERR "Please enter only a number! \n";
}
とか…?

495:デフォルトの名無しさん
10/05/31 17:42:19
>>493
繰り返しループ処理のやりかたがわからないワケだな。
プログラミングの基礎が備わってないな。perl以前の問題。
フローチャートから勉強しなおしなさい。

496:デフォルトの名無しさん
10/05/31 19:29:57
この時代にフローチャートかよw

497:デフォルトの名無しさん
10/05/31 19:34:20
オブジェクト指向とかカプセル化とか言っても訳わかんない気がする

498:デフォルトの名無しさん
10/05/31 20:08:51
>>494
ありがとうございます!
上手く動きました!!
空文字列のみを見つける正規表現があるのかと考えていましたが、
数字以外はダメという表記で良かったんですね。

ネットで探しても空文字列のみを見つける方法がよくわからなかったので悩んでいました。

>>497
自信を持って分かりますとは言えませんが、
サブルーチンなどで、プログラムの部品(パッケージ化とかカプセル化というのでしょうか)を
作って、プログラムを汎用性が高く、分かりやすく作ることかと理解しています。

初めてのPerlには、変数の扱いがCとは異なり、グローバル変数として扱われてしまう
と書かれていたので、Perlはオブジェクト指向としては、少し扱いにくい言語ということ
なんでしょうか?

499:デフォルトの名無しさん
10/05/31 20:18:17
>>498
Perlはオブジェクト指向もサポートしている。
変数については、myを使えばローカルな変数になる。
my $hensu;

500:デフォルトの名無しさん
10/05/31 20:18:17
>>498
20点くらいだな、その理解は

501:デフォルトの名無しさん
10/05/31 20:47:35
>>495,500
こういうのが癌

502:デフォルトの名無しさん
10/05/31 21:07:18
「いじめられる側にもいじめの原因がある」
「死刑には抑止力がある」
「何か言われて不快になったらその原因は発言者にある」


これまで当たり前だと思って、深く考えなかったこと・・・
周りに言われるままに、何の疑問も抱かなかったこと・・・
それらが本当に正しいのか、ちょっと立ち止まって考えてみませんか


虐めに関するよくある勘違い
URLリンク(jbbs.livedoor.jp)

死刑制度に関するよくある勘違い
URLリンク(jbbs.livedoor.jp)

外界は内界を映し出す鏡だって言ってたよ裏庭の鶏も
スレリンク(philo板:1-3番)


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch