トップページ⇒php
1001コメント349KB

Perl 初心者コーナー Part22

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/04/15 10:15ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0611nobodyさん03/05/05 15:47ID:eAEbJzW0
>>605さん
$aはsortのみたいに書き変えないでいい物かと思って失敗しましたけど
違うんですね、、
それにperlにも整数に直すint型が有るんですねー。(C++かじった事有)
これで小数点に悩まされずに済みます、ありがとうございました〜
0612nobodyさん03/05/05 16:03ID:???
でも負数に対しては切り捨てではなく切り上げになる罠
0613nobodyさん03/05/05 16:12ID:???
>>611
int型じゃない。int関数。
0614nobodyさん03/05/05 16:29ID:???
そもそもperlに型は無い
無型流自由殺法
0615nobodyさん03/05/05 17:53ID:???
物凄く初歩的な質問でごめんなさい。
これまで1か0のフラグとして使っていた変数$aの真偽を判定するのに
if($a == 1)
と記述していたのですが、もしかして
if($a)
だけでも良いのでしょうか。良いのならコードがかなりすっきりするんですが…。
良い、悪いだけでも結構ですので、どなたか教えていただけませんでしょうか。
0616nobodyさん03/05/05 17:57ID:???
$a and hoge;
    か
if ($a & 1){ hoge; }

が正解でつ。
0617nobodyさん03/05/05 18:03ID:???
>615
真偽判定だけならそれでもかまわない。

ないとは思うが、
if(1) # 真
if(0) # 偽
if('') # 偽
if('0') # 偽
if('00') # 真
こういうワナもあるので注意。
0618nobodyさん03/05/05 18:38ID:???
$aが文字列で、ヌルでなければ、という意味で
if ($a)
とやると、$a = "0" の罠にはまる。
0619nobodyさん03/05/05 18:40ID:???
ほぼうまくいくけど、ファイル名が "0" だった時だけ
動かないスクリプトとか、普通に出回ってそうだ
0620nobodyさん03/05/05 18:46ID:???
>>619
出回ってないよ
0621nobodyさん03/05/05 19:14ID:???
while ($file = <*>) { }

こんな感じの。うちではちゃんと動くけど。
062261503/05/05 19:38ID:???
皆様、参考になる御意見ありがとうございました。
トラップに陥らないよう注意して、書き直していこうと思います。
0623Dream ☆03/05/05 21:39ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0624nobodyさん03/05/06 01:24ID:???
606です
607さんのいったカウンタのリンクを貼るってどういうことですか?
レンタルカウンタ色々みたけど、どれがどれなのか。。。
0625nobodyさん03/05/06 01:26ID:???
該当するようなスレが思いつかなかったので、ここに質問。
プログラム覚えるのと、英語覚えるのどっちが難しいですか?
両方出来る人が居たら、教えてくだしい
0626nobodyさん03/05/06 01:34ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
0627nobodyさん03/05/06 01:36ID:???
http://pc.2ch.net/test/read.cgi/prog/1042377112/

このスレで聞くのがいいんじゃないか?
0628nobodyさん03/05/06 01:41ID:???
ファイルハンドルからファイル名を取得する関数はありますか?
0629nobodyさん03/05/06 02:52ID:???
>>628
ないです
0630nobodyさん03/05/06 18:03ID:39bU8fpC
やばいっす
Perl←の読み方教えてぇーペリ?ピール?
0631nobodyさん03/05/06 18:04ID:39bU8fpC
パールだってよ!チクショー遅かった・・・
0632nobodyさん03/05/06 18:24ID:???
ぺるる でつ。
0633nobodyさん03/05/06 18:36ID:???
>>629
うそついちゃだめだよ
0634nobodyさん03/05/06 20:52ID:???
>>633
じゃあ答えて
0635nobodyさん03/05/06 21:19ID:???
ファイルハンドルは、そもそもファイル名なんか知らないのでは。(…多分)
0636nobodyさん03/05/06 21:32ID:???
$value =~ /[\w\W]/g;
と
$value =~ /./g;
って、同じと考えていい?
なんか違いある?
0637nobodyさん 03/05/06 23:25ID:Bmqf5moK
正規表現に関する質問です。

これ↓を
SELECT * FROM MEMBER WHERE {NAME='[personName]' AND }AGE=[age]{ AND TEL='[tel]'} ORDER BY AGE;

こういう風に
SELECT * FROM MEMBER WHERE AGE=[age]{ AND TEL='[tel]'} ORDER BY AGE;

変換したいのですが下記ではだめなのでしょうか。

/\{.*?\[personName\].*?\}//
0638nobodyさん03/05/06 23:45ID:???
>>637
正規表現スレで聞いたほうが早いと思うが……
0639nobodyさん03/05/06 23:58ID:5MrMxTMp
フォームメール作ってるんですが、
送信元がメールソフトででませんねぇ。
ロリポなんだが、
[email protected]ってなる。
sendmailするとanonymousになっちまうのか?
ちなみに、
print MAIL "From: $address\n";
とやりました。
0640nobodyさん03/05/07 00:56ID:???
>>639
$mailprog = '/usr/lib/sendmail';

open(MAIL,"| $mailprog -t") || &error("メール送信に失敗しました");
print MAIL "To: $mailto\n";
print MAIL "From: $email\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "X-Mailer:r\n\n";
close(MAIL);
0641nobodyさん03/05/07 02:08ID:???
スカラ変数とスカラ電磁波はなんか関係あるのかなー
0642nobodyさん03/05/07 05:00ID:???
>>637
ストレートに s/{NAME='\[personName\]' AND }//でいいじゃん・・・
0643nobodyさん03/05/07 05:35ID:???
テキストから読み込み,変数に格納したエスケープシーケンスが
ファイル出力時に機能せず,エスケープシーケンスのまま
出力されます.環境はWin2000sp3,ActivePerl v5.6.1です.

#input.txt(sjis)
\t\t\n\n

#test.pl(sjis)
open(IN, "input.txt");$command=<IN>;close(IN);
open(OUT, "> output.txt");print(OUT "$command");close(OUT);

test.plを実行すると,output.txtには見事に「\t\t\n\n」と出力されます.
願わくばタブタブ改行改行と出力されて幸せになりたいです.

おいらは何か勘違いしているでしょうか?
0644nobodyさん03/05/07 08:16ID:???
open(IN, "input.txt");$command=<IN>;close(IN);
$command =~ s/\\t/タブ/g;
$command =~ s/\\n/改行/g;
open(OUT, "> output.txt");print(OUT "$command");close(OUT);

open(IN, "input.txt");$command=<IN>;close(IN);
$command =~ s/\\t/\t/g;
$command =~ s/\\n/\n/g;
open(OUT, "> output.txt");print(OUT "$command");close(OUT);
0645へるぷみー03/05/07 16:32ID:IktPSMvp
sendmailを使用してメールを送信していますが、
> Microsoft-Outlook-Express-Macintosh-Edition/5.02.2106
> Microsoft-Outlook-Express-Macintosh-Edition/5.0.6
のメーラーを使用している方から文字化けの報告があります。

件名は問題なく日本語でも文字化けしていないのですが、本文がぐちゃぐちゃです。
http://www.c-5.ne.jp/~itsuki/ の"Code Check"を使用して、
機種依存文字のチェックもしましたが、問題ありませんでした。

Microsoft-Outlook-Express-Macintosh-Editionに問題があるのかもしれませんが、
以下にソースを書きますのでプログラムに問題があれば教えて下さい。
解決方法をご存じの方、是非宜しくお願い致します。
0646へるぷみー03/05/07 16:33ID:IktPSMvp
$MailAdr = '[email protected]';
$send_subject = "サブジェクト";
$send_text = <<__EOF__;
日本語の本文
__EOF__

&jcode'convert(\$send_text,'jis');
&jcode'convert(\$send_subject,'jis');
$Subject = &mimeencode($send_subject);

$SendMessage .= "To: <$MailAdr>" . "\r\n";
$SendMessage .= "From: <from\@hogehoge.com>" . "\r\n";
$SendMessage .= "Subject: $Subject" . "\r\n";
$SendMessage .= "MIME-Version: 1.0" . "\r\n";
$SendMessage .= "Content-Type: text/plain; charset=ISO-2022-JP" . "\r\n";
$SendMessage .= "Content-Transfer-Encoding: 7bit" . "\r\n";
$SendMessage .= "\r\n";
$SendMessage .= $send_text;

open MAIL,"|/usr/lib/sendmail -t -i -f from\@hogehoge.com";
print MAIL $SendMessage;
close MAIL;
0647nobodyさん03/05/07 17:55ID:???
&mimeencode(メールヘッダ全部);
か
メール本文  =~ s/\r//g;
でどうよ。

・・・・・自信なし。
0648nobodyさん03/05/07 22:23ID:???
\nがになってしまうんですが、どうすればいいですか?
0649nobodyさん03/05/07 22:26ID:???
>>648
あきらめてください。
065064803/05/07 22:30ID:???
支障はありませんか?っていうかもしかして\n=ですか?
065163903/05/07 23:24ID:BGSRMxiA
えと、とりあえず僕のはっときます。
open(MAIL, "| $sendmail -t");
print MAIL "TO: $email\n";
print MAIL "Subject: $mailsubject\n";
print MAIL "Content-Type: text/plain;\n\n";
print MAIL "名前: $mailname\n";
print MAIL "From: $mail\n";
print MAIL "$mailbody\n";
print MAIL "$addr\n$age_a{\"$age\"}\n";
close(MAIL);

これで、送信元がちゃんとでるはずなんですけど・・・
でませんね
0652nobodyさん03/05/07 23:26ID:???
>>650
んなこたぁない。
\n=・だと、本気で思ったのなら、ちょっと笑ってしまう・・・(w

どういう環境なのかさっぱり書いてないな・・・。
質問の仕方悪い。
ソースの文字コードは?
ファイルに出力して・になるの?
デフォルト標準出力で・になるの?
もっと、詳しく書いてくれないと分からない。
0653nobodyさん03/05/07 23:57ID:???
>>651
-t しか指定しないならfromは出ないよ。
-t ではfromは読み込まれない。
065463903/05/08 01:03ID:YKg4v/HN
>>653
そうなんですか。本にかいていた通りにやったんですが、、、、
おまけに、本には、メーラーの画像で送信者でてるし。
-tとか詳しく教えてくれませんか?
0655nobodyさん03/05/08 04:20ID:???
>>653
漏れも-t しか指定してないが、fromは出るぞ。
漏れのを貼っておく。

$mailhead = <<EOF;
Received: This mail is sent from Democratic People's Republic of Korea.
EOF

$mailhead .= "From: $namefrom <$mailfrom>\n";
$mailhead .= "To: $nameto <$mailto>\n";
$mailhead .= "Subject: $subject\n";
$mailhead .= "Date: $date\n";
$mailhead .= "MIME-Version: 1.0\n";
$mailhead .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
$mailhead .= "Content-Transfer-Encoding: 7bit\n";
$mailhead .= "X-Priority: $priority\n";
$mailhead .= "X-Mailer:Microsoft Outlook Express 7.00.0000.0300\n";

if (-x $sendmail){
unless (open(OUT, "| $sendmail -t")){
&error('送信エラー','メールの送信に失敗しました。');
}
unless (print OUT &mimeencode($mailhead)){
&error('送信エラー','メールの送信に失敗しました。');
}
unless (print OUT $mailbody){
&error('送信エラー','メールの送信に失敗しました。');
}
close(OUT);
}
0656nobodyさん03/05/08 05:21ID:0p+XQofH
頭悪い質問ですみませんが、根本解決が自分だけでできなかっ
たため、質問させてください。

プログラムの設定ファイル等の使いまわしをきかせるため、
各ファイル構成を下記のようにディレクトリ分けしました。

public_html
|- cgi(プログラム)
|- template(テンプレート)
|- common(設定ファイル等)
|- image(画像)

common内のconfig.plには、
$template_dir = '/public_html/template';
$image_dir = '/public_html/image';
と各種ディレクトリ情報が格納されており、
これの設定ファイルを全プログラム内でrequireして、各種ディレク
トリ名等が変更されても、config.pl内の記述を変更するだけで済ま
せられるようにしております。

しかしこの場合、commonディレクトリ名が変更された時だけ、
全プログラムのrequire記述を変更しなければなりません。

なにかよい解決方法があれば、どうかご教授いただけないでしょ
うか。
頭悪い質問ですみませんが、どうか宜しくお願いいたします。
0657nobodyさん03/05/08 06:32ID:???
>>656
普通、そういう初期設定とかは、mainパッケージ内に記載するか、
mainパッケージと同じディレクトリに置いておくような物だと思うが・・・

こんなことしたら、ぜんぜん意味なくなるだろうが・・・
require専用の設定ファイルを作って、それをmainパッケージと同じディレクトリに置いて、
すべてのファイルで、そのrequire専用設定ファイルを呼び出すってのはどう?
0658nobodyさん03/05/08 06:33ID:???
>>656
なんかなぁ
perlの話しか?
さすがにライブラリのファイル/パス名はハードコーディングするだろ。
065964803/05/08 07:32ID:???
>>652
言葉足らずですみません

foreach(@deeta){
$E = $_; $C = $_;
$C =~ s/([0-9]{9,}) (.*)/$1/i;
if ($C < $jikan) {last;}
$E =~ s/([0-9]{9,}) (.*)/$1<>$SABA<>$ITA<>$2<><>\n/i;
$honbun.= $E;
}

open(FILE, ">come1.dat") or die;
print FILE $honbun;
close(FILE);

としてから、come1.datをメモ帳で開くと\nがになってダラダラと一文が…
ソースの文字コードは SHIFT-JIS です。
0660nobodyさん03/05/08 07:41ID:???
>>659
それどこで実行してるんだ?\nがLFになってるから認識できないんだろう。
メモ帳が認識する改行コードはCRLFだったはず。
066164803/05/08 07:51ID:???
XREA上です。新しい言葉"LF CRLF"を見つけたのでググッて勉強します…
0662nobodyさん03/05/08 08:07ID:???
>>661
Windows上で実行すると\nはCRLF(0x0D 0x0A)になる。
Mac上で実行すると\nはCR(0x0D)になる(の?Mac持ってないから知らん)
UNIX系とLinuxはLF(0x0A)になる。
0663nobodyさん03/05/08 08:08ID:???
http://www.xrea.com/?action=faq
---
●どのようなサーバー?どんな環境?
最新LinuxにApache、qmail、ProFTPDをアレンジした仕様になっています。
---

改行を表すエスケープシーケンス"\n"は
Linux環境でLF(0x0A)として出力されるわけです。
Windows標準の(メモ帳で開ける)改行コードはCR+LF(0x0D+0x0A)なので、
それ相応の書き方をしなければなりません。

書き方は検索してけれ。
0664nobodyさん03/05/08 09:15ID:???
バイナリモードでやれ。
0665nobodyさん03/05/08 10:54ID:???
しつもそです。

CGIで、csvファイルをzip圧縮したものを吐き出したいと思ってます。

#! /usr/bin/perl
print "Content-type: application/x-csv\n";
print "Content-Disposition: inline; filename=ahya.csv\n\n";
print "hoge,hoge\n";
exit;

でcsvの吐き出しはできたのですが、
これをzip圧縮して吐き出すにはどうすればいいでしょうか?
0666nobodyさん03/05/08 11:11ID:???
>>665
http://www.memb.jp/~deq/perl/doc-ja/Archive-Zip.html

http://pc.2ch.net/tech/kako/1006/10069/1006910650.html
の>>102以降とか。
066766503/05/08 11:33ID:???
>>666
ありがとうございます。

zipファイルを圧縮するのはsystem関数でもできるんですが、
zipファイルをディスク上に作っちゃいますよね?
それをさせないで、直でブラウザに吐き出すのって無理でしょうか?
Archive-Zipも一度ディスクに作るようなので。。
0668nobodyさん03/05/08 11:38ID:???
>>656
環境がわからんが、シンボリックにしる>common -> 変更後のディレクトリ

>>659
メモ帳で開くからややこしい。
改行コードを認識するアプリで開けるれ。
0669nobodyさん03/05/08 11:44ID:???
質問です。

行末の'(なんとか)'というのを削除したいです。
s/(.+?)$//;
だとだめでした。
s/\Q(\E.+?\Q)\E$//;
もだめでした。
s/(.+)$//;
だとまっちするようですが、当然、行中のものにマッチしちゃうので
困ります。どうしたらいいでしょうか。
0670nobodyさん03/05/08 12:26ID:???
>>669
括弧も含めたいなら、\( \) みたいにエスケープしないとだめだよ。
0671nobodyさん03/05/08 12:37ID:???
>>670
全角括弧なんですが・・・
0672nobodyさん03/05/08 12:38ID:???
実は全角が通らない
0673nobodyさん03/05/08 12:41ID:???
>>669です、テストデータも書いておきます。

木立(こだち)のなかに(夏目弱石)
山の上の芋粥(いもがゆ)(芥川蛇の介)
0674nobodyさん03/05/08 12:49ID:???
>669
行末と言っているが、改行を削除し忘れてたりしてないか?
0675nobodyさん03/05/08 12:50ID:???
chop;
$line = $_;
$line =~ s/(.+)$//;
print "$line\n";
0676nobodyさん03/05/08 12:58ID:???
>>669
CR(0x0d)が残ってたりして。
ローカルではちゃんと動いてる?

0677nobodyさん03/05/08 13:03ID:???
>>672
では、なぜ、s/(.+)$//;はまっちするんでしょうか。

>>674
chompやchopもやりましたし、文字コードもsjisとeucで
試しましたが、だめです。

>>675
>>673に挙げたテストデータでやってみれば分かりますが、
これでは、マッチしません。それに、うまくいったとしても
(.+)では、最初の括弧からマッチしてしまいます。

>>675
すべて削除してやってます。
「ローカル」って?CGIじゃないです。
0678nobodyさん03/05/08 13:07ID:???
while(<DATA>){
s/(.*)(.*?)\s.?$/$1/;
print;
}

__DATA__
木立(こだち)のなかに(夏目弱石)
山の上の芋粥(いもがゆ)(芥川蛇の介)
0679nobodyさん03/05/08 13:15ID:???
>>678
私の環境ではsjisにしても、eucにしてもだめです。

$ perl test1.pl
木立(こだち)のなかに(夏目弱石)
山の上の芋粥(いもがゆ)(芥川蛇の介)

$ perl test1.pl |nkf -s
木立(こだち)のなかに(夏目弱石)
山の上の芋粥(いもがゆ)(芥川蛇の介)

なぜでしょうか。
0680nobodyさん03/05/08 13:23ID:???
>>669ですが、ム板の正規表現スレ行ってきます。
皆さん、ご助言ありがとうございました。
0681nobodyさん03/05/08 13:32ID:???
>>677
うちの環境では>>675で期待通りの動作をすることを
確認済み
0682nobodyさん03/05/08 13:36ID:???
>>681
>>675では、
木立
山の上の芋粥
となるでしょう。
これがあなたの期待なのですね。求められているのは、
木立(こだち)のなかに
山の上の芋粥(いもがゆ)
ですよ。



0683nobodyさん03/05/08 13:43ID:???
>>682
おお、そういえばそうだった。
0684nobodyさん03/05/08 13:50ID:???
>>680
もう逝っちゃったかな?

jcode::tr(\$_, '()', '()');
s/\([^\(\)]+\)\n$/\n/;
jcode::tr(\$_, '()', '()');
print;
0685nobodyさん03/05/08 14:05ID:???
>>679
私の環境ではダメでしたか。

っていうか、その「私の環境」を書けよ・・・
最低、OSは何で、Perlのバージョンはいくつくらいは書けるだろ・・・
俺は>>678のソースで正常に動いた。
>>679の環境がおかしいんじゃねーのか?
0686nobodyさん03/05/08 14:35ID:???
>>684
ありがとうです。全角括弧を半角括弧に変えるのならエディタでもできる
のですが、全部Perlでやりたいと。
>>685
私の環境は、cygwin+perl,v5.6.1 built for cygwin-multiです。
>>678のソースは、動くことは動きますが何度やっても求めるものが
出てきません。

0687nobodyさん03/05/08 15:15ID:???
どう考えたってスカラー電磁波って、
ニコラ・テスラのパクりだろ。( ゚Д゚)
http://plaza16.mbn.or.jp/~satchel/
0688nobodyさん03/05/08 17:33ID:???
正規表現スレで鍛えて答えが判ったら教えてね
0689nobodyさん03/05/08 19:18ID:???
最近画像UPろだを設置したんですが
Berryという画像巡回のやつばかりで面白くないんで
Berryからのアクセスを弾く方法を探しています
なんかいい方法ないでしょうか?
imgboard.cgi使っています
0690nobodyさん03/05/08 19:23ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0691nobodyさん03/05/08 20:56ID:???
>>689
よくわかんないけど・・
Berryからアクセスされてるって判ってるなら弾くのは簡単なんでは?
0692nobodyさん03/05/08 21:05ID:???
Berryは正直にUser-Agentを名乗ってたような

こちとら負荷かけないようにまったりアクセスしてるんだが、
それでも禁止するならしやがれ、というスタンスですな
0693nobodyさん03/05/08 21:33ID:???
弾いた次の日からアクセス0になるのを分かっていてするのですか?
0694nobodyさん03/05/08 21:39ID:???
その次の日に偽UserAgentになって元のアクセス数に戻る罠
0695nobodyさん03/05/08 21:41ID:BuFtD7dz
./DAT の中にあるファイル数を調べるにはどうしたらいいんですか?
0696nobodyさん03/05/08 21:47ID:???
>>695
それはディレクトリ?
いろいろ方法があるけど、glob()あたりが簡単でいいんでない?
0697nobodyさん03/05/08 22:18ID:???
Berryも数がたまるとウザイもんだよ
0698nobodyさん03/05/08 22:52ID:???
>>695
if(opendir(DIR,"./DAT"))
$dir = @dir = <DIR>;
closedir(DIR);
}else{
print("opendir error");
}
@dirにはファイルが配列で
$dirにはその個数が入ると思うけど・・・

>>695
perlにもgrobあったのか 今知ったわ
こっちのほうがよさそうね
$dir = @dir = glob("./DAT/*");
0699nobodyさん03/05/08 22:53ID:???
二つ目の695は696の間違えですた スマソ
070069803/05/08 22:56ID:???
ちなみにopendirだと
.と..が入るから
$dirから2引いた数がファイル数ね。
0701nobodyさん03/05/08 23:03ID:w+g/ULrK
初心者なので質問させて下さい。

前から思ってたのですが、
「Perl」と「URL」
それぞれ何と読むのが正確ですか?
0702nobodyさん03/05/08 23:08ID:???
ぺるる と うるる
0703nobodyさん03/05/08 23:19ID:???
>>702
擬人化キボンヌ
0704nobodyさん03/05/08 23:21ID:???
>>701
性格による。
0705nobodyさん03/05/08 23:29ID:TaEzP3Hc
>>701
もう少しでDIがURLだったな
0706nobodyさん03/05/08 23:46ID:???
ちょっと質問です。
perlのソートを使おうとしているんですが、微妙に意味が分からない事になりました。

sort {$a <=> $b} @aaa;

数字を並べる時、この書きかたが一般的だと思うのですが、
$aと$bってなんでしょう。
「イツのまに、なにが代入されたのでしょうか?」←これが質問1。

で、実際のソートは、返ってくる数字「-1」「0」「1」の三種類によってsortが返すリストの順番だと思ったのですが、
「それは正解ですか?」←質問2

もし、正解ならば「-1」「0」「1」の三種類が発生する形式ならば可能ですか?
それとも、必ず「$a」「$b」を使うような形式にする必要がありますか?←質問3

詰まる所、$aと$bの中身がよく分からないので、sort自体がよく分からない物になってしまってます。
m(__)m
0707nobodyさん03/05/09 00:01ID:FPjkEDjh
テスト
0708nobodyさん03/05/09 00:02ID:???
何故$aと$bなのだ、という疑問については、
そうなってるからとしか説明しようないだろうな。

$aと$bは単純に比較する物
本当は関数を別に書いて、そこに登場する
0709Dream ☆03/05/09 00:04ID:???
何故$aと$bなのだ、という疑問については、
そうなってるからとしか説明しようないだろうな。

$aと$bは単純に比較する物
本当は関数を別に書いて、そこに登場しる
071070603/05/09 00:25ID:???
>>709
う〜ん。
回答ありがたいのですが、サッパリ分からないです…汗。
>>706の三つの質問の回答を待つと同時に、もう一つ質問させてもらいます。

とあるサイトで調べた所、
>このサブルーチンはソートすべきリスト中の要素2個を渡され、
>何回も繰り返し呼び出され、完全にソートされるまで繰り返す
と、上記のようにかいてありました。

sort {ルーチン} @リスト;
これは「@リスト」が並び替えて返ってくる値であり、
その順番を決めるのが「ルーチン」の部分だと思っています。

で、上に「ソートすべきリスト中の要素2個を渡され」
と書いてありますが、これが$aと$bだとにらんでいます。
この時、$aと$bの内容を自動ではなく、任意で決めることはできないのでしょうか?
いや、任意で決めたいと思っているのですが、そんな必要はないのかな?

■ このスレッドは過去ログ倉庫に格納されています