Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0497nobodyさん
05/02/18 05:26:56ID:qmmO8oMVモジュールに頼らずに入力されたパスフレーズをSHA1かけてファイルに保存しようと思ってます。
再配布可能でSHA1ハッシュ値を計算するサブルーチンをwebで検索したところ
ttp://www.mirrors.wiretapped.net/security/cryptography/algorithms/rc4/arcfour.pl
こちらでsha1サブルーチンがあったので、ちょっとここのサブルーチンを拝借して
$string = "ax";
print sha1($string);
という風にテストしてみたところSHA1ハッシュ値とは全然違う文字列が出力されました。
どのようにすればちゃんとしたSHA1ハッシュ値が得らるのでしょうか?
0498nobodyさん
05/02/18 05:36:15ID:???「データがカンマ区切り","されていない形式で」っていっているんだから
sort の中の split で","分割しちゃだめでしょ。
0499キヨ@496
05/02/18 06:50:20ID:wywZhzNy有り難うございます!
splitの\,を\tに変えたら作動しました!!
5〜6時間近く悩んでいたのに…。
本当にありがとう御座いました!!
0500486
05/02/18 08:42:07ID:4JcRNkuB親切な人ありがとー
一行でやるには関数では無くて、正規表現でやる事になるのですね。
勉強になりました。
0501nobodyさん
05/02/18 09:39:28ID:???SELECT * FROM TEST_TABLE;
これで全レコードのゼンフィールドを取得したとして。
@arrayの中に全レコードのhogeフィールドだけをデリファレンスして入れたい。
hogeフィールドは0番目だと仮定。
fetchall_arrayrefで返されるのが配列リファレンス。更に中に配列リファレンスなので
my @array = @{@{$sth->fetchall_arrayref}[0..$#{$sth->fetchall_arrayref}]}[0];
とかでいけるかと思いきやダメでしたorz
誰かわかる方いますか?
0502nobodyさん
05/02/18 09:48:08ID:???my $rows = $sth->fetchall_arrayref;
my @array = map { $_->[0] } @$rows;
0503501
05/02/18 10:21:48ID:???ありがとうございます。
変数作るの機雷なんで
my @array = map { $_->[0] } @{$sth->fetchall_arrayref};
としておきました。
もう一つお願いします。
sprintfで
$str = sprintf %d+100.%d-20.%d,@list;
こういう風に配列の中身にそれぞれ別の数字を足したり、文字列を付加したりしながらの
整形って不可能ですか?上記ではエラーでしたが;
やりたいことは
$str = $list[0]+100.$list[1]-20.$list[2];
です
0504nobodyさん
05/02/18 10:39:33ID:???0505504
05/02/18 10:47:26ID:dVwgIF/Dtruncate関数がダメならそれ以外で
open FH,"+<test.txt";
flock FH,2;
この状態のファイルの中身を一旦0にすることはできますか?
ファイルを上書きモ−ドで開くのは不可能です。このファイルを開いてる間に
処理内容が重複しては困ることをしてるので。
0506504
05/02/18 11:31:10ID:dVwgIF/D0508504
05/02/18 12:14:53ID:dVwgIF/D失敬な!
http://perl.misty.ne.jp/function02/truncate.html
http://www.7key.jp/program/perl/truncate.html
0509nobodyさん
05/02/18 12:16:49ID:???require './lib/lib1.pl';
--- lib1.pl ---
require './lib/lib2.pl';
open( FILE, "< file.txt" );
というファイル/ソースの時に、
original.pl を実行すると、
どこの file.txt, lib2.pl を読むのでしょうか?
この辺の位置関係を解説してるサイトがあれば
すみませんが教えてもらえると助かります。
0510nobodyさん
05/02/18 12:24:30ID:???0512nobodyさん
05/02/18 12:44:04ID:???$str = sprintf '%d%d%d', sub{ $_[0]+100, $_[1]-20, $_[2] }->(@list);
#応用
$str = sprintf '%d/%02d/%02d %02d:%02d:%02d', sub{$_[5]+1900,$_[4]+1,@_[3,2,1,0]}->(localtime);
0514503
05/02/18 13:29:28ID:???おお!
凄いですねそれ。どうなってるんですか?
無名関数のリファレンスを作ってるみたいですが、どうして->(リスト)が
引数として渡されるんでしょう?
0515nobodyさん
05/02/18 13:54:42ID:???これの降順ってのは無理?
print @hairetu[6..0];
for(0..2)の仕組みと同じっぽいから無理だと思うけど、ここならもしかして知ってる人がいるかもと期待してきてみた。
0517nobodyさん
05/02/18 14:00:30ID:???0518nobodyさん
05/02/18 14:19:43ID:???$code = sub{ $_[0]+100, $_[1]-20, $_[2] };
@list2 = $code->(@list);
$str = sprintf '%d%d%d', @list2;
これを一行にまとめているっていうのは理解できるよね。
参照演算子 "->" は、左辺値が関数リファレンスであれば
右辺に "()" を記述して関数を間接実行できる。
同様に左辺値が配列リファレンスであれば
右辺に "[]" を記述して配列要素を間接参照できるし
左辺値がハッシュリファレンスであれば
右辺に "{}" を記述してハッシュ要素を間接参照できる。
これは左辺値の評価結果が関数リファレンスでありさえすれば
"->()" でいつでも間接実行が行えるということ。
"sub{}" は無名関数リファレンスの値を持っているわけだから
無名関数を定義したと同時に実行させただけということになる。
もちろん関数を実行させているわけだから
"()" 内に指定したリストが引数として渡る。
0520503
05/02/18 14:36:44ID:???そういうことでしたか。わかりやすい説明ありがとうございました!
@{[]}や${\()}なんかと同じ位価値のある色々使えそうなテクですね^^
0521nobodyさん
05/02/18 14:39:12ID:???長い名前だね。[6,5,4,3,2,1,0]も[reverse 0..6]も変わらないorz
とにかくレスサンクス
0522nobodyさん
05/02/18 15:01:18ID:???> @{[]}や${\()}なんかと同じ位価値
そんなのが好きならこんなのもあるよ
${\do{}}
文字列のなかにブロック処理を記述できる。
$x = 1;
$str = qq(これは!${\do{
if($x){
"真";
}else{
"偽";
}
}}です\n);
print $str;
0523nobodyさん
05/02/18 15:03:28ID:???日本語で説明シテルサイトありませんか?
0525523
05/02/18 15:16:10ID:???ここに比較はかいてありましたが、何秒かかったかのやり方はどこあないでしょうか?
0526523
05/02/18 15:33:48ID:???英語読めませんが
timestr()
timethese()
timeit()
timethis()
ってBencmarkの関数ですか?どうしてパッケージ名なしで呼べるのでしょうか?
それと
my $code = sub {
my $a = "あいうえおあかかうskslkdjfんgsjfgsjfdbgsdfはfはfd";
$a =~ s/(\x45)/$1\x46/g;
};
timethis(100,$code);
としたら
timethis 100: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count)
こんなんでました。警告文は多分「しんらいできるカウントのためにあまりに少ない繰り返しなのでとてもできない。」
的な感じだと思いますが、秒数はこれで求めれるので主か?
単に処理が短いからbヴェンチもくそもあるかと文句をいわれてるのでsyか?>
0528nobodyさん
05/02/18 16:50:42ID:???>どうしてパッケージ名なしで呼べるのでしょうか?
モジュールがuseされた時にデフォルトのパッケージ関数が
呼び出し側にエクスポートされるようにモジュール側で記述されているから
呼び出し側でモジュールをuseするとパッケージ関数がインポートされて
パッケージ名を明示しなくても関数が使用できるようになる。
下のは正式なエクスポート方法ではないけど、エクスポートの真似事ができる。
実行するとtestサブルーチンが定義されてないとのエラーメッセージがでるが
コメントマークを外すとTESTパッケージのtest関数が実行できる。
package TEST;
#$main::{test} = \&test;
sub test{
print @_;
}
package main;
test(1,2,3);
0529nobodyさん
05/02/18 16:53:37ID:???package TEST;
$main::{test} = \&test ;
sub test{
print @_;
}
package main;
test(1,2,3);
0530nobodyさん
05/02/18 20:21:21ID:???http://www.harukaze.net/~mishima/perl/man/perlvar.1.html
> @INC 配列 @INC には、do EXPR、require、use によって評価す
> る Perl スクリプトを探す場所のリストが納められていま
> す。 初期状態では、コマンドラインスイッチ -I の引数
> とデフォルトの Perl ライブラリディレクトリ (おそらく
> "/usr/local/lib/perl5") とカレントディレクトリを表わ
> す "." を順につなげたものです。
0531nobodyさん
05/02/18 20:38:12ID:???こっちはカレントディレクトリ。
CGIの場合、UNIX環境であれば動作しているスクリプトと同じディレクトリ。
ただし、mod_perlの場合は違うから注意が必要。
http://www.ietf.org/rfc/rfc3875.txt
7.2. UNIX
For UNIX compatible operating systems, the following are defined:
> The current working directory
> The current working directory for the script SHOULD be set to the
> directory containing the script.
0533nobodyさん
05/02/19 12:26:16ID:???個人的には...split /&/......こういうデフォルトで$_を引数にとる関数が好き。
何でpushはとらないんかね。shifth取るくせに。
0535nobodyさん
05/02/19 15:55:05ID:???そっか。
ところで$_,@_の中身がセットされるときと削除される時のことを
詳しく説明してるサイトをどっかで見た気がするけど忘れてしまった。
誰か知らない?日本語のサイトなんだけど。
0536nobodyさん
05/02/19 19:19:29ID:???$_ は、map,grep を使ったときに、または、foreachで$_ が参照変数になったとき暗黙のlocal対象になるよ。
foreachで$_ 意外の参照変数を明示したらlocal対象にはならないけどね。
@_ は、サブルーチン内で暗黙のlocal対象になるよ。
だから、呼出されたサブルーチン内から呼出し元の@_の値を得ることはできない。
しかし、サブルーチン内でブロックがないまま、@_ にlocalを明示すると
呼出されたサブルーチン内のlocal前の@_ の値が、呼出し側の@_ に移るよ!
0537nobodyさん
05/02/19 19:20:29ID:???print "@_\n"; test1(); print "@_\n"; test2(); print "@_\n"; test3(); print "@_\n";
sub test1{
@_ = 10..19;
}
sub test2{
@_ = 20..29;
{
local @_;
}
}
sub test3{
@_ = 30..39;
local @_;
}
実行結果出力
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
30 31 32 33 34 35 36 37 38 39
0538nobodyさん
05/02/19 22:54:09ID:???$ENV{'LINES'}にメールの行数、$ENV{'SIZE'}にメールのバイト数が格納されているのは確認しましたが、メール本文がどこにあるかわかりません。
メール本文がどこに格納されているのかご存知の方がいましたら、教えていただけないでしょうか?
0539nobodyさん
05/02/20 08:10:37ID:???use vars を使用しますが、これでは require した外部ライブラリでも使用できてしまいます。
引数として渡した変数以外は外部ライブラリに参照させないことはできますでしょうか。
よろしくお願いします。
0540nobodyさん
05/02/20 09:05:42ID:???0541nobodyさん
05/02/20 13:26:09ID:???サブルーチン外で普通に my しとけばいいと思うけど。
0542nobodyさん
05/02/20 15:17:15ID:O52bAFUw@foo = qw(テスト Perl 適当);
$bar = $foo[int rand $#foo+1];
これより簡単になりますか?
0543nobodyさん
05/02/20 15:52:41ID:???0544nobodyさん
05/02/20 16:28:38ID:???0546nobodyさん
05/02/20 17:53:43ID:FLHTnHy4というふうに配列をソートしたいのですが、
普通にソートすると、
(http://hoge/100.jpg,http://hoge/1.jpg,http://hoge/200.jpg,http://hoge/2.jpg)
というふうになってしまいます。
よい方法はありませんか?
0548nobodyさん
05/02/20 18:24:41ID:FLHTnHy4ぐぐってみましたがよくわかりません
モジュールですか?
0549nobodyさん
05/02/20 18:26:01ID:???できないのでしょうか?
0550nobodyさん
05/02/20 18:39:48ID:???sort{
my($an) = ( $a=~/(\d+)\.jpg\z/ );
my($bn) = ( $b=~/(\d+)\.jpg\z/ );
$an <=> $bn
}@array;
とか。
0553nobodyさん
05/02/20 19:05:02ID:???0554nobodyさん
05/02/20 19:06:12ID:???@url = map{ $_->[0] }
sort{ $a->[1] <=> $b->[1] }
map{ m/(\d+)\.jpg$/; [$_, $1] } @url;
とか。
>>549
use FileHandle;
my $fh = FileHandle->new("hoe.txt") or die $!;
my $fh;
open($fh, "hoe.txt") or die $!;
# これは古いPerlと互換がないかも。
これで変数に入れられるから、オブジェクトでも扱える。
(クラスメンバなら、ファイルハンドルのままでも構わないのでは。)
0555549
05/02/20 19:45:08ID:???0556nobodyさん
05/02/20 20:14:16ID:O52bAFUwfor(1..100){}
などとできますが、
飛び飛びの連続値を指定する場合はどうすればいいんでしょう?
for(1.20,30..100){}
とかじゃ無理だし、なにか上手いやり方はありますか?
0557nobodyさん
05/02/20 21:01:53ID:???1と20の間に . が2個あれば行くぞ。
0558nobodyさん
05/02/20 21:04:25ID:O52bAFUwうわ、ほんとだ。
自分の場合は間に1つだけの要素を挟んだりするんですが、そのばあいは
for(1..3, 5..5, 7..9){}
こんな感じですかね。
0559nobodyさん
05/02/20 21:06:11ID:???0560nobodyさん
05/02/20 21:08:32ID:O52bAFUw0561nobodyさん
05/02/20 22:23:17ID:???if ($pid= fork){
# ここは親プロセス
}elsif (defined $pid){
# ここは子プロセス
}elsif ($! =~ /No more process/){
# A
}else {
}
上記のようなソースをたまに見かけます(らくだ本など)が、A部分には
子プロセスが作れなかったのに何がくるのでしょうか?
わたしが思うに、子プロセス生成に失敗したので結果的に親プロセス部分
しか処理されないような感じがするのですが・・・。
0563nobodyさん
05/02/20 22:51:31ID:BvAf0Y1w$hoge(perl)の数値(文字列)をそのまま hoge(flash)に。
よろしくお願いしますm(__)m
0564nobodyさん
05/02/20 23:12:34ID:BvAf0Y1w0566nobodyさん
05/02/21 01:37:00ID:???0567nobodyさん
05/02/21 02:33:04ID:ZzrL/Ht5print等で、
1. print 'あ '.(ドット)"$hoge\n";
2. print 'あ ',(カンマ)"$hoge\n";
ドットを使うのと、カンマを使うのとでの違いはありますか?
0568nobodyさん
05/02/21 04:57:26ID:???0569nobodyさん
05/02/21 10:51:03ID:???SQL文はわかってるのですが、どう受け取ればいいのか;
my $value = $sth->fetchall_arrayref;
これだと一応受け取れますが、フィールド名のハッシュになってないので扱いにくいです。
しかしハッシュ系は
my $value = $sth->fetchrow_hashref;
しか見つけられなかったのですが、無理なのでしょうか。
このやり方は1レコードだけなのですが・・・
0570nobodyさん
05/02/21 11:09:40ID:???これの文字コードをjcode.plを使って変える時って
foreach (keys %$hash) { jcode::convert(\$hash->{$_},"sjis")}
で一応できましたが、なんか変な感じ。
そもそもリファレンスさえ渡したら向こうで中身を書き換えてくれるんですよね。
なので渡す時にデリファレンスしてからリファレンスを作るのって変。
ハッシュリファレンスの中身をjcode.plに効率よく渡す方法ってあるんでしょうか?
0571nobodyさん
05/02/21 11:38:37ID:???「ハッシュ全体へのリファレンス」と「ハッシュの個々のエントリへのリファレンス」は
全く無関係な別物だから、仕方ないだろう。そういうものだ。
0572nobodyさん
05/02/21 11:43:32ID:???map内で配列に手を加えればいいけどね。
いい例なのがこれ。
map {jcode::convert(\$_,"euc")} @$arrayref
あ、これも同じデリファレンス→リファレンスだなw
0573nobodyさん
05/02/21 14:03:46ID:???my %hash = (a => "あいうえお" , b=> "かきくけこ");
foreach (keys %hash) {jcode::convert(\$hash{$_},"sjis")}
0575nobodyさん
05/02/21 14:43:19ID:???あ、いや、>>570がjcode::convertにハッシュリファレンスを渡すためにわざわざ
最初の段階でリファレンスにして無意味だなと思っているみたいだったんで
だったらハッシュをわざわざリファレンスにしなくていいんじゃないと思っただけ。
0576nobodyさん
05/02/21 14:44:54ID:???「jcode::convertにハッシュ要素のスカラーリファレンス」と読み替えてくれ。
0577nobodyさん
05/02/21 15:16:50ID:???この$valueの中身を書き換えずに_を-に変えて出力するにはどうすればいい?
print ....
まったくわからないorz
0578577
05/02/21 15:28:46ID:???print "content-type:text/html;charset=euc-jp;\n";
print "\n";
my $value = qq|aiu_oiy|;
print qq|${sub{$_[0] =~ s/\_/\-/g; print $_[0]}->($value)}あいうえお|;
print "<br>";
print "aiu",$value;
これやったら何故か「あいうえお」すら表示されない・・・
しかし置換後の文字列の出力はしっかりできている。
一体どういうことなんだろう。無名ルーチンに異次元につれてかれてSTDINへの出力を
したくてもSTDINがどこにあるか分からないとか?
0579577
05/02/21 15:31:51ID:???print "\n";
my $value = qq|aiu_oiy|;
print qq|@{[sub{my $a = shift; $a =~ s/\_/\-/g; $a}->($value)]}あいうえお|;
print "<br>";
print $value;
これでできたけどなんかなぁ。
まあいいけど>>578はなんでその後が表示されないんだろ?
0580nobodyさん
05/02/21 17:41:26ID:???$in{'ngword'} =~ s/\n/\'\,\'/g;
print BS <<"EOM";
# NGワード
\@ngword= ('$in{'ngword'}');
EOM
として、
ファイルハンドルBSに
@ngword = ('馬鹿','死ね,'あほ');
と書きたいのですが、
・"鹿"と"'"の間
・"ね"と","の間
にメモ張で見ると文字化けしているような
文字("■"を小さくしたようなもの)、Perl編
集用で使っているエディタだと改行が入っ
てしまいます。
なぜなのかわかりません。。。
0581nobodyさん
05/02/21 19:51:45ID:???, は、リスト評価。 . は、文字列を結合してからスカラー評価。
, と . では、演算子の優先順位が違うので、計算式が入る場合は注意。
>>577
print join( '-', split( '_', $value ) );
とか
print "$1-$2-$3" if $value =~/([^_]+)_([^_]+)_([^_]+)/;
とか
0583nobodyさん
05/02/21 20:08:42ID:???my $value = 'oaoa_aaaa_test';
(my $tmp = $value) =~ tr/_/-/;
print "$value => $tmp\n";
sub _toh { (my $str = shift) =~ tr/_/-/; $str }
print "$value => ${\_toh($value)}\n";
print join '-', split '_', $value;
print "$value => ${\ (sub { (my $str = shift) =~ tr/_/-/; $str })->($value) }\n";
local $" = '';
print "$value => @{[ map { tr/_/-/; $_ } split //, $value ]}\n";
0585nobodyさん
05/02/21 20:12:54ID:???http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0586nobodyさん
05/02/21 20:37:31ID:???@_ は関数内で暗黙のlocalだけど、@_の各要素である$_[0],$_[1],...等は、
呼出し元の引数の別名だから、上書きすると、呼び出し元で引き数として渡した
対応する変数の中身が書き変るよ。
好きなのどうぞ
print qq|${\sub{$_[0]->[0] =~ s/_/-/g;$_[0]->[0]}->([$value])}あいうえお|;
print qq|${\map{$_->[0] =~ s/_/-/g;$_->[0]}[$value]}あいうえお|;
print qq|${\do{(local $_=$value) =~ s/_/-/g;$_}}あいうえお|;
0587nobodyさん
05/02/21 21:46:42ID:LbE3SevLそれをデリファレンスしながら受け取りたいんですが不可能ですか?
my (%a,%b) = map{%{$_}}&hoge;
こんなことを考えてみたけど、よく考えたら全くダメだった;
0588nobodyさん
05/02/21 21:49:32ID:???Group\Apache\htdocs\test.cgi line 353.
こんなエラー内容なんだけど、誰かわかる?
^@こんな文字列検索しても出てこないんだよね。ライン付近を見ても異常が見当たらない。
0589nobodyさん
05/02/21 21:51:30ID:???0590nobodyさん
05/02/21 21:56:01ID:Mewlqio00591587
05/02/21 22:15:40ID:LbE3SevLこれで一応できました^^
0593nobodyさん
05/02/21 23:42:47ID:???ほんとはこういう必殺技があるんだけど型グロブが理解できなければ使わないほうがいい。
(*a,*b) = hoge();
0594nobodyさん
05/02/22 11:45:02ID:???いきなり
my %a;
for (1..10){
$a{a} += 2;
}
とかやっても失敗しなかったのですが、偶然ですか?
my %a = (a => 0);
とはじめにしておいたほうが当然無難でしょうけど、なんか面倒なんですよね。
面倒でもやっておかないと失敗することはあるんでしょうか?
0595nobodyさん
05/02/22 12:06:49ID:xOztdvV5よし行く象を最後にすべきだろう
0596nobodyさん
05/02/22 12:07:19ID:???■ このスレッドは過去ログ倉庫に格納されています