X



【モダン推奨】Perlについての質問箱 50箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2012/01/21(土) 10:56:39.03
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )

回答する際はモダンな方法でお願いします
(例 jcode.plではなくEncodeモジュールを使った方法)
理由はもう2012年です。いい加減2000年以前の方法はやめましょう。
最新のPerlを使うほうがかっこいいです。
いつまで勉強しないつもりですか?
過去にとらわれるのはもうやめです。進歩しませんよ。

このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

http://www.perl.org/get.html
● 2011/10/30 現在の最新版: 5.14.2

▼ 前スレ
Perlについての質問箱 49箱目
http://toro.2ch.net/test/read.cgi/tech/1319953460/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り


0587デフォルトの名無しさん
垢版 |
2018/04/18(水) 02:06:34.84ID:yJ81KmRv
>>586
DB使って、どういうキーでクエリー出すの?
俺は詳しくないから考え方だけでいいので教えて
・x>=キーのものの中からMINを取って、それのyを出力?
・x>=キー and 次のレコードのx<キー?(次のレコードって見れるのかは知らんけど)
・x,yの他にx2として範囲の最後をデータとして追加しておき、x<=キー and x2<キー?
何かベストマッチな方法がありそうだけどね
(上記の方法ではとてもDBの検索が効率よくいけるとは思えんので)
0588デフォルトの名無しさん
垢版 |
2018/04/18(水) 03:06:20.17ID:kaO6I25j
単純にSELECT y FROM hoge WHERE x BETWEEN a AND bで
実態はSQL側で最適化してくれるよ
データを扱うことに特化した高級言語な訳だし

個人的にはDB使うかどうかって、
データの流動性(?)がポイントな気がする
弄る機会が多ければ多いほど恩恵受けられる訳だから
0589デフォルトの名無しさん
垢版 |
2018/04/18(水) 03:22:30.21ID:yJ81KmRv
>>588
BETWEEN a AND bって、aからbの間ってことじゃなかったっけ?
x=100502の場合のyを求めるのにどう書くの?
BETWEEN 100502 AND 100502でいいんだっけ?
0590デフォルトの名無しさん
垢版 |
2018/04/18(水) 03:27:30.58ID:yJ81KmRv
これって例えば、10000から11000の間にあるデータxを全部抽出したい場合とかに使うものなのでは?
0591デフォルトの名無しさん
垢版 |
2018/04/18(水) 03:58:19.16ID:yJ81KmRv
>>587の例って全部おかしかったので書き直しとく
・MAX(x<=100502)
・x<=100502 and (次のレコードのx)?>100502
・x<=100502 and x2>=100502
0592デフォルトの名無しさん
垢版 |
2018/04/18(水) 11:34:48.13ID:gg2GabAw
表は x の最大と最小(xmin,xmax)と y をただ入れといて select y from xytbl where x between xmin and xmax みたいにすればいいじゃん。
xmin + 1 が次の xmax と一致するので無駄があるが xmin, xmax にインデックス作っておけば多分速くはなるだろう。
どうしても無駄をなくしたい場合は xmin と y だけにして xmax はビュー作ってそちらであるかのように見せかけておくか、または複雑になるが一つのSQL文にするかだ。
0593デフォルトの名無しさん
垢版 |
2018/04/19(木) 02:32:23.49ID:h5gs+kbl
>>592
何を言ってるのか不明
表にxminとyしかないのなら、xは使えないだろ
また、[x,y,xmin,xmax]=
([100000,1000,100000,100500], [100501,1001,100501,100700], [100701,1002,100701,120000],…)
ってことで
select y from xytbl where x between xmin and xmax
なら全レコードがマッチするよ
0594デフォルトの名無しさん
垢版 |
2018/04/19(木) 03:01:26.91ID:h5gs+kbl
between句は、
SELECT カラム名 , ... FROM テーブル名 WHERE カラム BETWEEN 値1 AND 値2;

SELECT カラム名 , ... FROM テーブル名 WHERE カラム >= 値1 AND カラム <= 値2;
と書くのと同等の機能

select y from tbl01 where x between 100000 and 110000
なら
select y from tbl01 where x >= 100000 and x<=110000
と同じってこと
0595デフォルトの名無しさん
垢版 |
2018/04/19(木) 10:18:42.11ID:XRkJ53+o
>>593
うまく伝わらなかったかな?考えてることは多分同じだよ。
例えば以下のようにするの(以下はSQLiteでのSQL)。

create table xytbl (xmin, xmax, y);
insert into xytbl (xmin, xmax, y)
values (100000, 100500, 1000), (100501, 100700, 1001), (100701, 120000, 1002);
create table xtbl (x);
insert into xtbl (x) values (9999), (100300), (100502), (118000), (120100);
select x, y from xytbl, xtbl where x between xmin and xmax;

ここでは xtbl に x の値だけ並べて入れておいて後でまとめて selectして x, y 両方出している。
0596デフォルトの名無しさん
垢版 |
2018/04/19(木) 10:19:56.20ID:T9/zIgZR
ごめんびとうぃーん言い出しっぺだけどダメだね
感覚と言うかノリだけで書いてしまった
実際書くと即だめじゃんってなるやつ
0597デフォルトの名無しさん
垢版 |
2018/04/19(木) 10:22:29.59ID:XRkJ53+o
PerlからDBI経由でDBアクセスするならxtbl不要でxの部分はprepareで'?'にしておいてexecuteで実際の値を渡せば良い。
0598デフォルトの名無しさん
垢版 |
2018/04/19(木) 10:28:26.42ID:T9/zIgZR
真面目に今考えた結果
Select y From hoge Where ? < x Order by x Desc Limit 1;
で多分取れる
0599デフォルトの名無しさん
垢版 |
2018/04/23(月) 17:03:26.38ID:YcjqEwjB
$$で取得するプロセスIDはどんな環境でも最大4桁までですか?
0600デフォルトの名無しさん
垢版 |
2018/04/23(月) 17:19:28.43ID:AJxfAl3T
>>599
んなこたなかろう。Linuxで ps -fe とかやれば5桁ぐらいのが沢山出てくるぞ。
かといって最大5桁で作って安心してはいけない。
将来的に変わるかも知れないしLinux以外ではもっと桁数あるかも知れないからな。
0601デフォルトの名無しさん
垢版 |
2018/05/01(火) 17:33:53.54ID:Jzi33zXB
全く初歩的な質問ですいません
ググってみたのですがそのものズバリの例を見つけることができませんでした。
やりたいことは、連装配列に配列を入れて取り出すことです。
最後の出力行が [2] となることを意図していますが、出力は
[]  となり、ワーニングもでています。
配列を入れたつもりの連装配列の要素が配列とは認識されていないようです。
この場合どのように書けば、所期の結果が得られるでしょうか?

$ perl -v

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi
(with 46 registered patches, see perl -V for more detail)
〜後半略〜

$ cat sample.pl

my %hasy01;
my @array01;

@array01=(2,4,6,8);
$hash01{"name"}=@array01;

printf( "[%s]\n", $array01[0] );
printf( "[%s]\n", $hash01{"name"}[0] );

$ perl -w sample.pl
[2]
Use of uninitialized value in printf at sample.pl line 9.
[]
0606デフォルトの名無しさん
垢版 |
2018/05/01(火) 21:42:46.89ID:4WtZiQYp
デリファレンス側もちょっと不満があるな

printf( "[%s]\n", ${$hash01{"name"}}[0] );
こうか
printf( "[%s]\n", $hash01{"name"}->[0] );
こうがいい
0608デフォルトの名無しさん
垢版 |
2018/05/02(水) 08:00:00.39ID:lnsF+QsJ
#自分ならこうするかな
my $hash01;
my @array01;

@array01=(2,4,6,8);

$hash01 = {
name => \@array01 ,
foo => \@array01 ,
bar => \@array01 ,
# .... 多分こういうふうに増えるだろうし
};

printf( "[%s]\n", $h->{name}->[0] ); # -> があると目が滑りにくい!
0609デフォルトの名無しさん
垢版 |
2018/05/05(土) 20:27:28.60ID:yJAqb+uF
正規表現でマッチした部分を$1,$2などで取り出すけど
$いくつまであるかわからない場合$1,$2...$nをまとめて配列に入れる方法ってどうやるんですか?
0610デフォルトの名無しさん
垢版 |
2018/05/05(土) 21:54:57.88ID:ddSxgz72
>>609
ttp://perldoc.jp/docs/perl/5.22.1/perlrequick.pod#Extracting32matches
>リストコンテキストでは、グループ化付きのマッチング /regex/ は マッチングした値のリスト ($1,$2,...) を返します。 従ってこれは以下のように書き換えられます
> ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);

ttp://perldoc.jp/docs/perl/5.22.1/perlrequick.pod#More32matching
>リストコンテキストでは、//g はマッチングしたグループのリストを返します; グループ化の指定がなければ、正規表現全体にマッチングするリストを返します。 従って
> @words = ($x =~ /(\w+)/g);
0612デフォルトの名無しさん
垢版 |
2018/05/06(日) 12:36:15.67ID:Bse1bLkg
>>611
え?困らんだろ。普通に $10 とか $11 とか書けば良いだけだし。
0613デフォルトの名無しさん
垢版 |
2018/05/06(日) 13:41:43.10ID:1K09Bg92
Perl のことだとは言ってないな。正規表現の話なら 9 までしか使えない方が多数派だ。Perl でさえ昔はそうだった。
まあ、そういう話なら $10 ではなく \10 と書くべきかもしれないが。
0614デフォルトの名無しさん
垢版 |
2018/05/06(日) 18:20:08.93ID:Bse1bLkg
いやこのスレは「Perl についての質問箱」なわけで・・・
0615デフォルトの名無しさん
垢版 |
2018/05/15(火) 01:25:39.67ID:bz5cqKe9
ユーザ定義関数のリファレンスを変数に代入しておき、そのリファレンス変数を
参照することによって関数を呼び出すことができます。たとえばこんな感じに。
sub s { $_[0]+1 }
$r = \&s;
print $r->(1)."\n";

$ perl usr.pl
2

それでは、popやshift、printなどの組み込み関数についても、リファレンスを変数に代入しておき、変数を参照することによって組み込み関数を呼び出すことができないか方法を探しています。

しかしCOREやCORE::GLOBAL名前空間を使ってできないか、ためしてみましたがうまくいきません。たとえば

$r = \CORE::print;
#print "$r\n";
print $r->(3.14, "\n");

を実行すると

Not a CODE reference at 〜.pl line 3.

となります。

$r = \CORE::GLOBAL::print;
#print "$r\n";
print $r->(3.14, "\n");

を実行しても

Not a CODE reference at 〜.pl line 3.

となってしまします。何かいい方法をご存知でしたら教えてくださいませ。
0617615
垢版 |
2018/05/15(火) 23:35:25.73ID:fP8R1+3G
>>616
\&CORE もためしたけれど

$r = \&CORE::print;
print "$r\n";
$r->(3.14, "\n");

実行すると

Undefined subroutine &CORE::print called at 〜.pl line 3.
CODE(0x3919c)

となるのよ。
できなことなのかね…
0618デフォルトの名無しさん
垢版 |
2018/05/16(水) 00:12:42.68ID:uHifQt6J
ttps://perldoc.perl.org/CORE.html
COREパッケージの関数もリファレンスを取得したり別名を定義することができる(pushなど)
ただし一部はベアワードでしか呼び出せない(printなど)

>組み込み関数についても、リファレンスを変数に代入しておき、変数を参照することによって組み込み関数を呼び出すことができないか
結論: ものによる
0619615
垢版 |
2018/05/16(水) 01:13:39.26ID:N7L5seGg
>>618
ありがとう。
0621615
垢版 |
2018/05/16(水) 07:58:19.21ID:lqxKAjJz
>>620
そうすれば機能的に可能だけれど、
ユーザ関数のコードがワンクッション間に入るので
パーフォマンス的にみて、
できれば組み込み関数を直接、第一級関数としてクロージャーなどに
使えないか調べていた、ってわけですのよ
0623デフォルトの名無しさん
垢版 |
2018/05/23(水) 19:29:13.97ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

U85LY
0625デフォルトの名無しさん
垢版 |
2018/05/24(木) 12:17:56.05ID:62mXzMMG
bless
それは祝福
0627デフォルトの名無しさん
垢版 |
2018/05/26(土) 06:15:15.44ID:qdFYQfps
さすがにリファレンスですらない変数だと怒られた
でも、勝手に作った偽オブジェクトを食わせたりはできる

他の言語はそのへんの安全装置はどうなってるんだろう
0628デフォルトの名無しさん
垢版 |
2018/05/26(土) 11:44:11.22ID:nibGH99w
blessは、オブジェクトにパッケージを関連付けるだけだろ。
どんな「安全装置」が必要なのか?

ちなみに、RubyもJavaScriptも、動的に後からメソッドとか足し放題だな。
まあ、スクリプト言語としては残念でもないし当然。
0629デフォルトの名無しさん
垢版 |
2018/05/26(土) 11:59:50.95ID:qdFYQfps
メソッドを足すのと、コンストラクタが生成してないものを使うのは全然違うだろ
0630デフォルトの名無しさん
垢版 |
2018/05/26(土) 15:30:59.65ID:NxLTutQ0
Pod::PerldocJp という日本語 perldoc を cpanm 使ってインストールしてみたが、root でないとエラーが出て動かない(Linux 環境ね)。

$ perldocjp perldocjp
Error stat on '/tmp/.perldocjp/perldocjp.pod': そのようなファイルやディレクトリはありません at /usr/local/share/perl5/Pod/PerldocJp.pm line 78.
$

root になるとちゃんと出てくる。ただし sudo perldocjp perldocjp ではダメで、 sudo su - とかで root でログインした状態で perldocjp perldocjp とするとちゃんと動く。
実行時の環境変数 LANG は一般ユーザもroootも ja_JP.UTF-8 になっている。


これ Linux でインストールしてみてうまく行った人いる?


Pod::PerldocJpとperldocjpコマンドについての日本語での説明はここね。
http://search.cpan.org/~ishigaki/Pod-PerldocJp-0.18/perldocjp
0632デフォルトの名無しさん
垢版 |
2018/06/08(金) 21:09:03.47ID:JtDK6GNM
例えばファイル名を入れて関数を呼んで、
処理結果を入れた配列なりのリファレンスを戻り値で返す
別のファイル名で同じ関数を呼んで、結果のリファレンスを別の変数で受ける

それで普通に動くんだけど、
なぜ同じ関数のmyで宣言した変数が違うオブジェクトを指しているのか、
なぜ古い方は消えてしまわないのか、
そもそもいつまで残ってるのか、
みたいな部分が何となく不安

参照カウントの仕組みを理解しても、やっぱり不安
0633615
垢版 |
2018/06/09(土) 01:53:50.05ID:dh6JCgcP
>>632
気持ちはなんとなく分かるけど、
こういう人に対して何と言って分かりやすく説明したら
よりよいかは
少し考えてしまうな…
0634デフォルトの名無しさん
垢版 |
2018/06/09(土) 05:26:23.38ID:uYb8xFM5
大丈夫。参照されなくなったやつは自動で消える。
0635デフォルトの名無しさん
垢版 |
2018/06/09(土) 08:22:42.99ID:VVS81UdD
消えないことに対する不安じゃないんだよな

肉体は既に滅びているけど、どこかにある名簿にまだ名前があるお陰で、
辛うじて魂だけまだ現世に留まってる感じ

リファレンスを戻り値で受けるんじゃなくて、
自分で宣言した変数のリファレンスを引数で渡して、
そこに入れて貰う方式なら安心できる
意味は同じなんだけど
0636デフォルトの名無しさん
垢版 |
2018/06/09(土) 08:45:10.02ID:ngqKHOqq
strdupの仕様の気持ち悪さ
無名関数のリファレンスの気持ち悪さ
みたいなやつなら、俺も感じる
0637デフォルトの名無しさん
垢版 |
2018/06/09(土) 17:49:06.89ID:uYb8xFM5
うーん。しかし、そういうのは言語を実現する環境の実装にバグがあるかどうかの問題だよなあ。
そのバグを気にするならどんな言語も使えなくなるのでは?コンパイルする言語でもバグってて
変なコード作られたら終わりだしなあ。
0638デフォルトの名無しさん
垢版 |
2018/06/09(土) 19:13:31.22ID:sS73Mbwb
信頼性の話じゃないだろ。
言ってしまえば、リファレンスとかオブジェクトとか、なんかふわふわしてて、なんとなく納得がいかん、てだけ。

感覚的には慣れの話でしかないと思うけど、どうしてもというなら、C++でもやってみればいいのでは。
newとかヒープとかを把握できれば、実はぜんぜんふわふわしてないことが理解できるはず。

余計に混乱するかもしらんけども。w
0639デフォルトの名無しさん
垢版 |
2018/06/09(土) 19:58:15.52ID:VVS81UdD
C言語で関数内にstatic変数を持ってて、
そこに何か格納してそのポインタを返す、みたいな仕組みなら安心する

何回呼んでも同じポインタが返ってきて、前回の内容は保存されていない
だから必要なら呼んだ側の責任で保存しとかないといけない
家がない子はいない

perlのsub内のmy変数のリファレンスも見かけはそれと似てるけど、
実際の動作が全然違って、実体は動的に生成される
じゃあC言語のauto変数みたいなもんかというと、関数が終わってもスコープを抜けない
かといってずっと存在する訳でもなくて「要らなくなったら消える」というルールが人智を超える

うまく動くように出来てるんだから、怖がらずに飛んでみろ的な
0640デフォルトの名無しさん
垢版 |
2018/06/09(土) 20:16:55.67ID:vLAdQtfD
もはや信じるか否かという宗教的問題か?
0641デフォルトの名無しさん
垢版 |
2018/06/09(土) 20:29:44.29ID:VVS81UdD
変数の寿命なんて本来はコードから静的に判るものだったのに、
それを動的にする代わりに管理を手放して機械に任せることにした
それはなかなかのパラダイムシフトである筈なのに、
オブジェクト指向のデータ隠蔽とセットで隠蔽されてあんまり気にしてない

コンストラクタさんに任せとけば全部うまくやってくれるから
0643デフォルトの名無しさん
垢版 |
2018/06/10(日) 05:50:21.80ID:eOmqsLdO
>>639
それだとマルチスレッドの時に困るわけだな。呼び出し側でバッファ作ってそのポインタを渡すという手もあるが、
量が動的に変化する場合はそれだけでは実現できない。で、malloc() 使うわけだが、そうするとどこかで必ず
free() する必要が出てくる。これが煩わしいので自動でなんとかならないかと色々やってるのが今時の言語。
とはいっても Perl は30年以上前に作られた言語だけどね。
0645デフォルトの名無しさん
垢版 |
2018/06/10(日) 18:52:31.32ID:7xflXXzg
個人環境をMariaDBに代えてみたけど
DBD::MariaDBがgithubにしかなくてMySQLに戻したわ(´・ω・`)
こういうとこ困るなー枯れてると
0648デフォルトの名無しさん
垢版 |
2018/06/11(月) 13:01:10.20ID:FLjqN/A3
枯れてるって、不具合とか掘り尽くされて安定してるって言ういい意味と
動きが無いって言う悪い意味の両面がある気が
0649デフォルトの名無しさん
垢版 |
2018/06/11(月) 13:04:00.52ID:FLjqN/A3
>>646
my.conf的な(my.confではない)、恐らくMySQLにあってまりあDBに無いファイル読みにいってこける。
たぶん簡単に修正できるけど、CPAN取得ファイルは弄りたくないから様子見にしたわ
0651デフォルトの名無しさん
垢版 |
2018/06/11(月) 17:21:23.85ID:FLjqN/A3
>>650
この場合「枯れる 言語」のが適切だと思うけど…
俺は文脈でどっちの意味でも使ってたわ
0652デフォルトの名無しさん
垢版 |
2018/06/11(月) 19:02:34.25ID:HvQh9O78
不具合が枯れたなら分かるけど、動きがないはよくわからん。
ユーザー数は関係ないってこと?C言語はどっち?
0653デフォルトの名無しさん
垢版 |
2018/06/11(月) 19:30:59.90ID:giD/kjqV
%cat = (%hash1, %hash2);
みたいにするとハッシュが結合できる
keys %cat でkeyの配列が取得できる

でも、keys (%hash1, %hash2)
とすると怒られる
keys {%hash1, %hash2}
ならいけるけど、5.12では通らない

どうすれば
0655デフォルトの名無しさん
垢版 |
2018/06/11(月) 21:25:55.72ID:C5cAV0Rs
それだけだと同じキーがあった場合に2つ出て来るのでもう一捻り必要ということになるんだろうな。

こうかねえ?

keys map { $_ => 1 } keys %hash1, keys %hash2
0656デフォルトの名無しさん
垢版 |
2018/06/11(月) 21:27:28.65ID:bgvsbZyV
>>653

$cat a.pl
use strict;
my %h0 = ( a => 1, b => 2);
my %h1 = ( b => 3, c => 4);
print( keys( %{ +{ %h0 , %h1 }}),"\n");
$perl a.pl
acb
$
$# できるといえばできるけど、君がやってるやり方をおすすめするよ。その方が余計なバグを防止できる。
0657デフォルトの名無しさん
垢版 |
2018/06/11(月) 21:37:24.11ID:giD/kjqV
怒られる方法が何故悪いのかがよく判らんのだよな
普通に無名のハッシュになるんじゃないのかと思うんだけど、
> Type of argument to keys on reference must be unblessed hashref or arrayref
hashでもarrayでもない何かのリファレンスになってる?
0658デフォルトの名無しさん
垢版 |
2018/06/11(月) 21:46:36.09ID:C5cAV0Rs
{}で括ってるからhashrefと思ったとか
0659デフォルトの名無しさん
垢版 |
2018/06/11(月) 23:58:04.20ID:kxBy2s6A
keys()が引数にリファレンスをとれるようになったのは最近(でもないけど)だから、曽野せいなんでは。
>>657
0661デフォルトの名無しさん
垢版 |
2018/06/12(火) 00:01:02.77ID:DCSlzX2w
%hash1 = (a => 1, b => 2);
%hash2 = (c => 3, d => 4);
$ref = (%hash1, %hash2);
print $ref;

さて、何が表示されるでしょう?
0662デフォルトの名無しさん
垢版 |
2018/06/12(火) 02:21:03.71ID:zyhS8Ljg
perl -e "use Data::Dumper; %hash1 = (a => 1, b => 2); %hash2 = (c => 3, d => 4); $ref = (\%hash1, \%hash2); print Dumper($ref);"
0663656
垢版 |
2018/06/12(火) 13:02:00.90ID:0nDO7HX7
>>660
つっこみありがとう。もう長いこと Perl 使ってるからね、そこはデリファレンスしたいんだよ。
そもそも Perl4 にはリファレンスが無かったんだ。
C でも関数ポインタ使うときは (*p)() みたいな書き方してるよ。
0664デフォルトの名無しさん
垢版 |
2018/06/13(水) 02:19:57.94ID:mK+NhzCY
>>661
2/8 と出た。何が出てるんだこれ?
0665デフォルトの名無しさん
垢版 |
2018/06/13(水) 06:32:37.33ID:a9+2+9qX
>>661
通常はそこはリスト値に展開されて %hash2 の要素のどれかが全体のスカラ値になるはずだけど、そうなってないね。
その仕様は公式ドキュメントのどこに書かれてるの?
通常の評価をしてもらうにはどう書けばいいの?
0666デフォルトの名無しさん
垢版 |
2018/06/13(水) 07:40:41.18ID:3GuASBgR
>>664
5.26からは挙動が変わったので注意
ttp://perldoc.jp/docs/perl/5.26.0/perl5260delta.pod#scalar40-37hash41-32return32signature32changed

>>665
リスト値が展開されてから代入されるのではなく
左辺がスカラコンテキスト -> リストの一番右側の値が代入される -> %hashをスカラコンテキストで評価
と思われ
0667デフォルトの名無しさん
垢版 |
2018/06/13(水) 10:44:03.43ID:a9+2+9qX
ありがとう。perldata は読んでたけど理解できてなかった。
0668デフォルトの名無しさん
垢版 |
2018/06/15(金) 22:18:58.35ID:Cep0TxDe
正規表現のマッチ結果って、どこかのデフォルト変数に入ってないの?
($match1, $match2) = ($1, $2);
とやる代わりに、
($match1, $match2) = @_;
みたいにやりたい
0669デフォルトの名無しさん
垢版 |
2018/06/15(金) 22:34:53.18ID:+TY+tyj1
リストコンテキストで評価すれば$1とか使わず代入できる
($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);

ttp://perldoc.jp/docs/perl/5.22.1/perlretut.pod#Extracting32matches
0673デフォルトの名無しさん
垢版 |
2018/06/16(土) 14:40:46.76ID:QsFR7Mzm
どうやっても、($1, $2)に相当するような配列は、自分で作らないと無いんだけど、
そもそもそのやり方は便利なのか? という問題があって

括弧の数を左から数えて、挿入したら間違えずにずらして、というやり方は、
どう考えても避けるべきテクニックなので、わざわざ改良版でそんな方法を
準備したりはしない
0674デフォルトの名無しさん
垢版 |
2018/06/17(日) 02:57:43.02ID:rS3/QTqY
>>669
ちょっと捻ってこうすると配列に入るね。

@t = ($time =~ /(\d\d):(\d\d):(\d\d)/);

で、マッチしなければ @t には何も入らないので if (@t) { マッチした時の処理 } のように書ける。
0675デフォルトの名無しさん
垢版 |
2018/06/17(日) 04:40:03.87ID:rS3/QTqY
if の中に突っ込んじゃえば見た目が元とあまり変わらなくなるな。

if (my @t = $time =~ /(\d\d):(\d\d):(\d\d)/) {
 # このブロックに入った場合は @t[0..2] に値が入っている。
}
0676デフォルトの名無しさん
垢版 |
2018/06/17(日) 09:21:55.81ID:jBtDb+3n
それが常套手段
でも、次の行で使うためだけにテンポラリの変数を命名して、
ということを避ける手段が大抵はあるのに、この場合は無さそうなのが気になる
0679デフォルトの名無しさん
垢版 |
2018/06/17(日) 17:43:24.21ID:jBtDb+3n
もう括弧を数えるのはやめようぜ、ということなのだろう
$1, $2 の代わりの配列があったとしても、数えないといけないのは同じなので、
明示的にラベルを付けて書くのが人間的
0680デフォルトの名無しさん
垢版 |
2018/06/17(日) 21:23:30.12ID:hnLcPBvl
あー。まあそうかな。
0681デフォルトの名無しさん
垢版 |
2018/07/04(水) 17:49:09.45ID:XD9RzW/r
使ってる Perl が 24.1 になったんだけど、どこかで do の仕様変わった?
do('.state')
がエラーになるんだが。
@INC に '.' を加えれば見つけてくれるけど
do('./.state')
と書いとくべきだったよ。
0684デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:16:13.94ID:gFgZc5FG
WCG
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況