1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429
|
.\" 1999 PTM Przemek Borys
.rn '' }`
.\" $RCSfile: perlfunc.1,v $$Revision: 1.17 $$Date: 2003/05/29 11:06:06 $
.\"
.\" $Log: perlfunc.1,v $
.\" Revision 1.17 2003/05/29 11:06:06 robert
.\" poprawki (głównie warningi groffa)
.\"
.\" Revision 1.16 2002/08/22 14:47:30 robert
.\" poprawione błędy formatowania - nałożony man-pages-pl-0.22-roffix.patch z RedHata
.\"
.\" Revision 1.15 2001/07/24 06:59:57 wojtek2
.\" [błąd] fatalny => krytyczny
.\"
.\" Revision 1.14 2001/06/14 08:43:13 wojtek2
.\" s/,chyba, że/,chyba że/
.\" plus trochę literówek, formatowania etc.
.\"
.\" Revision 1.13 2000/10/22 16:15:28 wojtek2
.\" wiodące (spacje, zera etc.)->początkowe
.\" kontrolne (znaki, sekwencje)->sterujące
.\" także "klawisze kontrolne" (Ctrl+klaw.)->klawisze sterujące
.\"
.\" Revision 1.12 2000/03/18 16:00:27 wojtek2
.\" 1. sprawdzone pakiety mtools i file
.\" 2. conajmniej->co najmniej
.\"
.\" Revision 1.11 1999/09/30 06:37:19 siewca
.\" poprawki ortograficzne
.\"
.\" Revision 1.10 1999/09/11 22:17:18 siewca
.\" ortografy
.\"
.\" Revision 1.9 1999/09/03 01:12:14 siewca
.\" trochę korekt orgrotografogicznych ;>
.\"
.\" Revision 1.8 1999/08/30 08:42:40 wojtek2
.\" perlfunc: kilka drobnych poprawek
.\" user*, group*: dodana przestroga
.\"
.\" Revision 1.7 1999/08/06 10:51:05 wojtek2
.\" Pokuta: napis->łańcuch
.\" rekursja->rekurencja
.\" inne drobne
.\"
.\" Revision 1.6 1999/08/03 11:07:22 wojtek2
.\" bistable->dwustanowy
.\" przeważnie " xx rather than yy" -> "xx zamiast yy"
.\"
.\" Revision 1.5 1999/08/02 12:08:52 pborys
.\" string->napis
.\" shell->powłoka
.\" kernel->jądro
.\"
.\" Revision 1.4 1999/07/31 19:18:54 pborys
.\" zmiana slashy na ukośniki
.\"
.\" Revision 1.3 1999/07/31 15:27:30 pborys
.\" korekszkenz
.\"
.\" Revision 1.2 1999/07/13 14:39:16 pborys
.\" FAQ - Przestrogi/zastrzeżenia
.\" robotnicy - wiadomo
.\" whatis - nowo skompilowany
.\" perlfunc.1 - poprawiony styl (przynajmniej w tym gupim wstępie ;)
.\" which.1 - lokalizowanie pliku
.\" nanosleep.2 - ekstremalnie dokładne pauzowanie
.\" select.2 - sprawdzanie stanu deskryptorów, przenośny sleep
.\" sigaction.2 - operacje na sygnałach
.\" sigblock.2 - bsd'owy sposób blokowania sygnałów
.\" glob.3 - rozwijanie symbolicznych ścieżek shella w normalne
.\"
.\" Revision 1.1 1999/07/12 22:22:53 pborys
.\" f77.1: dodane tłumaczenia pozostawionych tekstów (poza copying ;)
.\" FAQ: dodane PRZESTROGI
.\" perlfunc.1: wersja beeeeta ;)
.\"
.\"
.de Sh
.br
.if t .Sp
.ne 5
.PP
\fB\\$1\fR
.PP
..
.de Sp
.if t .sp .5v
.if n .sp
..
.de Ip
.br
.ie \\n(.$>=3 .ne \\$3
.el .ne 3
.IP "\\$1" \\$2
..
.de Vb
.ft CW
.nf
.ne \\$1
..
.de Ve
.ft R
.fi
..
.\"
.\"
.\" Set up \*(-- to give an unbreakable dash;
.\" string Tr holds user defined translation string.
.\" Bell System Logo is used as a dummy character.
.\"
.tr \(*W-|\(bv\*(Tr
.ie n \{\
.ds -- \(*W-
.ds PI pi
.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
.ds L" ""
.ds R" ""
.\" \*(M", \*(S", \*(N" and \*(T" are the equivalent of
.\" \*(L" and \*(R", except that they are used on ".xx" lines,
.\" such as .IP and .SH, which do another additional levels of
.\" double-quote interpretation
.ds M" """
.ds S" """
.ds N" """""
.ds T" """""
.ds L' '
.ds R' '
.ds M' '
.ds S' '
.ds N' '
.ds T' '
'br\}
.el\{\
.ds -- \(em\|
.tr \*(Tr
.ds L" ``
.ds R" ''
.ds M" ``
.ds S" ''
.ds N" ``
.ds T" ''
.ds L' `
.ds R' '
.ds M' `
.ds S' '
.ds N' `
.ds T' '
.ds PI \(*p
'br\}
.\" If the F register is turned on, we'll generate
.\" index entries out stderr for the following things:
.\" TH Title
.\" SH Header
.\" Sh Subsection
.\" Ip Item
.\" X<> Xref (embedded
.\" Of course, you have to process the output yourself
.\" in some meaninful fashion.
.if \nF \{
.de IX
.tm Index:\\$1\t\\n%\t"\\$2"
..
.nr % 0
.rr F
.\}
.TH PERLFUNC 1 "perl 5.004, patch 01" "12/Jun/97" "Podręcznik programisty perla"
.IX Title "PERLFUNC 1"
.UC
.IX Name "perlfunc - Perl builtin functions"
.if n .hy 0
.if n .na
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.de CQ \" put $1 in typewriter font
.ft CW
'if n "\c
'if t \\&\\$1\c
'if n \\&\\$1\c
'if n \&"
\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
'.ft R
..
.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
. \" AM - accent mark definitions
.bd B 3
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds ? ?
. ds ! !
. ds /
. ds q
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
.ds oe o\h'-(\w'o'u*4/10)'e
.ds Oe O\h'-(\w'O'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds v \h'-1'\o'\(aa\(ga'
. ds _ \h'-1'^
. ds . \h'-1'.
. ds 3 3
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
. ds oe oe
. ds Oe OE
.\}
.rm #[ #] #H #V #F C
.SH "NAZWA"
.IX Header "NAME"
perlfunc \- Wbudowane funkcje perla
.SH "OPIS"
\fI Uwaga! To tłumaczenie może być nieaktualne!\fP
.PP
.IX Header "DESCRIPTION"
Funkcje z tej sekcji mogą służyć pomocą w wyrażeniach. Podpadają one pod
dwie główne kategorie: operatory list, oraz nazwane operatory
jednoargumentowe. [Przyp. tłum.: w perlu nie ma prawdziwych funkcji, są
operatory]
Różnią się one w związku priorytetowym przecinkiem.
(zobacz tablicę priorytetów na stronie \fIperlop(1)\fR.). Operatory list
pobierają więcej niż jeden argument, podczas gdy operatory jednoargumentowe,
z definicji,
nigdy nie biorą więcej niż jeden argument. Tak więc przecinek kończy argument
operatora jednoargumentowego, lecz jedynie rozdziela argumenty operatora
listy. Ogólnie, operator jednoargumentowy daje swojemu argumentowi kontekst
skalarny,
podczas gdy operator listowy może dawać zarówno kontekst skalarny, jak i
listowy. Jeśli daje obydwa, to argumenty skalarne będą najpierw, a za nimi
nastąpią argumenty listowe. (Zauważ, że może istnieć tylko jeden argument
listowy.) Np. funkcja \fIsplice()\fR ma trzy argumenty skalarne, za którymi
następuje lista.
.PP
W opisach składni, które są niżej, operatory list, które oczekują listy (i
dają kontekst listowy elementom tej listy) są pokazywane z argumentem LISTA.
Lista taka może składać się z dowolnej kombinacji argumentów
skalarnych lub wartości listowych; wartości listowe będą włączone w listę
tak, jakby każdy pojedynczy element był interpolowany w tym punkcie listy,
tworząc dłuższą, jednowymiarową wartość listową. Elementy typu LISTA powinny
być oddzielone przecinkami.
.PP
Każda funkcja z poniższej listy, może być użyta bez, albo z nawiasami
wokół swoich argumentów. (Opisy składni pomijają nawiasy.) Jeśli używasz
nawiasów, to prosta (lecz czasem zaskakująca) reguła jest taka:
\fIWYGLĄDA\fR jak funkcja, więc \fIJEST\fR funkcją i priorytet nie ma
znaczenia. W przeciwnym wypadku jest to operator listowy lub operator
jednoargumentowy i priorytet się liczy. I biała spacja między funkcją i
lewym nawiasem nie liczy się\*(--więc musisz być czasem ostrożny:
.PP
.Vb 5
\& print 1+2+4; # Drukuje 7.
\& print(1+2) + 4; # Drukuje 3.
\& print (1+2)+4; # Też drukuje 3!
\& print +(1+2)+4; # Drukuje 7.
\& print ((1+2)+4); # Drukuje 7.
.Ve
Jeśli uruchamiasz perla z przełącznikiem \fB\-w\fR, to będziesz o tym
ostrzegany. Na przykład trzecia z powyższych linii daje w efekcie:
.PP
.Vb 2
\& print (...) interpreted as function at - line 1.
\& Useless use of integer addition in void context at - line 1.
.Ve
Dla instrukcji, które mogą być używane zarówno w kontekstach skalarnych, jak
i listowych, błąd nie wymagający przerwania jest ogólnie wskazywany w
kontekście skalarnym przez zwrot niezdefiniowanej wartości, a w kontekście
listowym przez zwrot listy null.
.PP
Zapamiętaj następującą regułę:
.Ip "\fI\s-1NIE\s0 \s-1ISTNIEJE\s0 \s-1OGÓLNA\s0 \s-1REGUŁA\s0 \s-1KONWERSJI\s0 \s-1LISTY\s0 \s-1W\s0 \s-1SKALAR\s0!\fR" 8
.IX Item "\fI\s-1THERE\s0 \s-1IS\s0 \s-1NO\s0 \s-1GENERAL\s0 \s-1RULE\s0 \s-1FOR\s0 \s-1CONVERTING\s0 A \s-1LIST\s0 \s-1INTO\s0 A \s-1SCALAR\s0!\fR"
.PP
Każdy operator i funkcja decyduje, jaki rodzaj wartości jest najbardziej
odpowiedni do zwrócenia w kontekście skalarnym. Niektóre operatory zwracają
długość listy, która byłaby zwrócona w kontekście listowym. Niektóre
zwracają pierwszą wartość listy. Niektóre zwracają ostatnią wartość listy.
Inne zwracają liczbę pomyślnych operacji. Ogólnie, robią one to, czego
chcesz, chyba że oczekujesz spójności.
.Sh "Funkcje perla według kategorii"
.IX Subsection "Perl Functions by Category"
Oto funkcje perla (włączając rzeczy, które wyglądają jak funkcje, np.
niektóre słowa kluczowe i nazwane operatory), poukładane według kategorii.
Niektóre funkcje pojawiają się w więcej niż jednym miejscu.
.Ip "Funkcje dla skalarów lub łańcuchów" 5
.IX Item "Functions for SCALARs or strings"
chomp, chop, chr, crypt, hex, index, lc, lcfirst, length,
oct, ord, pack, q/\s-1ŁAŃCUCH\s0/, qq/\s-1ŁAŃCUCH\s0/, reverse, rindex,
sprintf, substr, tr///, uc, ucfirst, y///
.Ip "Wyrażenia regularne i porównywanie wzorców" 5
.IX Item "Regular expressions and pattern matching"
m//, pos, quotemeta, s///, split, study
.Ip "Funkcje numeryczne" 5
.IX Item "Numeric functions"
abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt,
srand
.Ip "Funkcje dla prawdziwych tablic (@ARRAYs)" 5
.IX Item "Functions for real @ARRAYs"
pop, push, shift, splice, unshift
.Ip "Funkcje dla danych listowych" 5
.IX Item "Functions for list data"
grep, join, map, qw/\s-1ŁAŃCUCH\s0/, reverse, sort, unpack
.Ip "Funkcje dla %HASHów (tablic asocjacyjnych)" 5
.IX Item "Functions for real %HASHes"
delete, each, exists, keys, values
.Ip "Funkcje wejścia i wyjścia" 5
.IX Item "Input and output functions"
binmode, close, closedir, dbmclose, dbmopen, die, eof,
fileno, flock, format, getc, print, printf, read, readdir,
rewinddir, seek, seekdir, select, syscall, sysread, sysseek,
syswrite, tell, telldir, truncate, warn, write
.Ip "Funkcje dla danych o określonej długości lub rekordów" 5
.IX Item "Functions for fixed length data or records"
pack, read, syscall, sysread, syswrite, unpack, vec
.Ip "Funkcje dla deskryptorów plików, plików lub katalogów" 5
.IX Item "Functions for filehandles, files, or directories"
\fI\-X\fR, chdir, chmod, chown, chroot, fcntl, glob, ioctl, link,
lstat, mkdir, open, opendir, readlink, rename, rmdir,
stat, symlink, umask, unlink, utime
.Ip "Słowa kluczowe związane z kontrolą działania programu" 5
.IX Item "Keywords related to the control flow of your perl program"
caller, continue, die, do, dump, eval, exit, goto, last,
next, redo, return, sub, wantarray
.Ip "Słowa kluczowe związane z zakresami" 5
.IX Item "Keywords related to scoping"
caller, import, local, my, package, use
.Ip "Różne funkcje" 5
.IX Item "Miscellaneous functions"
defined, dump, eval, formline, local, my, reset, scalar,
undef, wantarray
.Ip "Funkcje dla procesów i grup procesów" 5
.IX Item "Functions for processes and process groups"
alarm, exec, fork, getpgrp, getppid, getpriority, kill,
pipe, qx/\s-1ŁAŃCUCH\s0/, setpgrp, setpriority, sleep, system,
times, wait, waitpid
.Ip "Słowa kluczowe związane z modułami perla" 5
.IX Item "Keywords related to perl modules"
do, import, no, package, require, use
.Ip "Słowa kluczowe związane z klasami i obiektowością" 5
.IX Item "Keywords related to classes and object-orientedness"
bless, dbmclose, dbmopen, package, ref, tie, tied, untie, use
.Ip "Niskopoziomowe funkcje gniazd" 5
.IX Item "Low-level socket functions"
accept, bind, connect, getpeername, getsockname,
getsockopt, listen, recv, send, setsockopt, shutdown,
socket, socketpair
.Ip "Funkcje komunikacji międzyprocesowej Systemu V" 5
.IX Item "System V interprocess communication functions"
msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop,
shmctl, shmget, shmread, shmwrite
.Ip "Pobieranie informacji użytkownika i grupy" 5
.IX Item "Fetching user and group info"
endgrent, endhostent, endnetent, endpwent, getgrent,
getgrgid, getgrnam, getlogin, getpwent, getpwnam,
getpwuid, setgrent, setpwent
.Ip "Pobieranie informacji sieciowej" 5
.IX Item "Fetching network info"
endprotoent, endservent, gethostbyaddr, gethostbyname,
gethostent, getnetbyaddr, getnetbyname, getnetent,
getprotobyname, getprotobynumber, getprotoent,
getservbyname, getservbyport, getservent, sethostent,
setnetent, setprotoent, setservent
.Ip "Funkcje związane z czasem" 5
.IX Item "Time-related functions"
gmtime, localtime, time, times
.Ip "Funkcje nowe w perl5" 5
.IX Item "Functions new in perl5"
abs, bless, chomp, chr, exists, formline, glob, import, lc,
lcfirst, map, my, no, prototype, qx, qw, readline, readpipe,
ref, sub*, sysopen, tie, tied, uc, ucfirst, untie, use
.Sp
* \- \f(CWsub\fR było słowem kluczowym w perl4, lecz w perl5 jest to
operator, który może być używany w wyrażeniach.
.Ip "Funkcje przedawnione w perl5" 5
.IX Item "Functions obsoleted in perl5"
dbmclose, dbmopen
.Sh "Alfabetyczny listing funkcji perla"
.IX Subsection "Alphabetical Listing of Perl Functions"
.Ip "-X \s-1UCHWYTPLIKU\s0" 8
.IX Item "-X \s-1FILEHANDLE\s0"
.Ip "-X \s-1WYRAŻ\s0" 8
.IX Item "-X \s-1EXPR\s0"
.Ip "-X" 8
.IX Item "-X"
Test pliku, gdzie X jest jedną z niżej wymienionych liter. Ten
jednoargumentowy operator pobiera argument, nazwę pliku lub jego uchwyt.
Następnie testuje plik i sprawdza, czy coś jest
w nim prawdziwe. Jeśli argument zostanie pominięty, testuje \f(CW$_\fR,
nie licząc \f(CW-t\fR, które testuje \s-1STDIN\s0.
Zasadniczo zwraca \f(CW1\fR dla wyniku pozytywnego i \f(CW''\fR
dla negatywnego, a wartość niezdefiniowaną, jeśli plik nie istnieje. Mimo
śmiesznych nazw, priorytety są takie same jak każdym innym nazwanym
operatorze jednoargumentowym i argument może być otoczony nawiasami.
Operator może być jednym z:
.Sp
.Vb 4
\& \-r Plik jest odczytywalny przez efektywny uid/gid.
\& \-w Plik jest zapisywalny przez efektywny uid/gid.
\& \-x Plik jest wykonywalny przez efektywny uid/gid.
\& \-o Właścicielem pliku jest efektywny uid.
.Ve
.Vb 4
\& \-R Plik jest odczytywalny przez rzeczywisty uid/gid.
\& \-W Plik jest zapisywalny przez rzeczywisty uid/gid.
\& \-X Plik jest wykonywalny przez rzeczywisty uid/gid.
\& \-O Właścicielem pliku jest rzeczywisty uid.
.Ve
.Vb 3
\& \-e Plik istnieje.
\& \-z Plik ma rozmiar zerowy.
\& \-s Plik ma rozmiar niezerowy (zwraca rozmiar).
.Ve
.Vb 8
\& \-f Plik jest prostym plikiem.
\& \-d Plik jest katalogiem.
\& \-l Plik jest dowiązaniem symbolicznym.
\& \-p Plik jest nazwanym potokiem (FIFO).
\& \-S Plik jest gniazdem.
\& \-b Plik jest blokowym plikiem specjalnym.
\& \-c Plik jest znakowym plikiem specjalnym.
\& \-t Uchwyt pliku jest otwarty do tty.
.Ve
.Vb 3
\& \-u Plik ma ustawiony bit `setuid'.
\& \-g Plik ma ustawiony bit `setgid'.
\& \-k Plik ma ustawiony bit `sticky'.
.Ve
.Vb 2
\& \-T Plik jest plikiem tekstowym.
\& \-B Plik jest plikiem binarnym (przeciwieństwo \-T).
.Ve
.Vb 3
\& \-M Wiek pliku w dniach, gdy uruchomił się skrypt
\& \-A To samo dla czasu dostępu.
\& \-C To samo dla zmiany informacji inode.
.Ve
Interpretacja operatorów praw pliku \f(CW-r\fR, \f(CW-R\fR, \f(CW-w\fR,
\f(CW-W\fR, \f(CW-x\fR i \f(CW-X\fR bazuje jedynie na prawach pliku i
uid/gid użytkownika. Mogą istnieć inne powody, dla których w rzeczywistości
nie możesz go odczytać, zapisać lub uruchomić. Zauważ też, że dla
superużytkownika, operatory \f(CW-r\fR, \f(CW-R\fR, \f(CW-w\fR, i \f(CW-W\fR
zawsze zwracają 1, a \f(CW-x\fR i \f(CW-X\fR zwracają 1, jeśli ustawiony
jest tak dowolny bit wykonania. Skrypty uruchamiane przez superużytkownika
powinny więc wywoływać do celów testowania praw pliku funkcję
\fIstat()\fR lub tymczasowo zmienić uid na coś innego.
.Sp
Przykład:
.Sp
.Vb 5
\& while (<>) {
\& chop;
\& next unless \-f $_; # ignoruj specjalne
\& ...
\& }
.Ve
Zauważ, że \f(CW-s/a/b/\fR nie dokonuje zanegowanego podstawienia.
Powiedzenie
\f(CW-exp($foo)\fR działa wciąż zgodnie z oczekiwaniami, jednak jedynie
pojedyncze litery za znakiem minusa są interpretowane jako testy plikowe.
.Sp
Przełączniki \f(CW-T\fR i \f(CW-B\fR działają tak, że testują pierwszy
blok pliku w poszukiwaniu dziwnych znaków, takich jak dziwne kody sterujące,
lub znaki z wysokiego zestawu znaków. Jeśli jest ich zbyt wiele (>30%), to
jest to plik \f(CW-B\fR, w przeciwnym wypadku to plik \f(CW-T\fR.
Dodatkowo, każdy plik, zawierający w pierwszym bloku null jest uważany za
plik binarny. Jeśli \f(CW-T\fR lub \f(CW-B\fR jest używane na uchwycie
pliku, to testowany jest bieżący bufor standardowego wejścia zamiast
pierwszego bloku.
Zarówno \f(CW-T\fR jak i \f(CW-B\fR zwracają odpowiedź pozytywną
dla pliku null lub pliku, który jest na EOF podczas testowania jego
uchwytu. Z uwagi na to, że dla testu \f(CW-T\fR trzeba odczytać plik,
w większości przypadków używa się najpierw \f(CW-f\fR, jak w
\f(CWnext unless \-f $file && \-T $file\fR.
.Sp
Jeśli któryś z operatorów testu plików (lub \fIstat()\fR czy \fIlstat()\fR)
otrzymałby specjalny uchwyt pliku, składający się z samego podkreślenia, to
użyta zostałaby struktura `stat' z poprzedniego testu pliku, oszczędzając
wywołania systemowego. (Nie działa to dla \f(CW-t\fR, a ponadto powinieneś
pamiętać,
że \fIlstat()\fR i \f(CW-l\fR zostawiają w strukturze wartości dla dowiązań
symbolicznych, a nie rzeczywistych plików.) Przykład:
.Sp
.Vb 1
\& print "Can do.\en" if \-r $a || \-w _ || \-x _;
.Ve
.Vb 9
\& stat($filename);
\& print "Readable\en" if \-r _;
\& print "Writable\en" if \-w _;
\& print "Executable\en" if \-x _;
\& print "Setuid\en" if \-u _;
\& print "Setgid\en" if \-g _;
\& print "Sticky\en" if \-k _;
\& print "Text\en" if \-T _;
\& print "Binary\en" if \-B _;
.Ve
.Ip "abs \s-1WARTOŚĆ\s0" 8
.IX Item "abs \s-1VALUE\s0"
.Ip "abs" 8
.IX Item "abs"
Zwraca moduł argumentu.
Jeśli parametr \s-1WARTOŚĆ\s0 zostanie pominięty, to używane jest \f(CW$_\fR.
.Ip "accept \s-1NOWEGNIAZDO\s0,\s-1GNIAZDO\s0" 8
.IX Item "accept \s-1NEWSOCKET\s0,\s-1GENERICSOCKET\s0"
Przyjmuje nadchodzące połączenie na gnieździe, podobnie jak wywołanie
systemowe \fIaccept\fR\|(2). Po sukcesie zwraca spakowany adres, a w razie
porażki \s-1FALSE\s0. Przykład użycia można znaleźć w sekcji
\fISockets: Client/Server Communication\fR strony podręcznika \fIperlipc(1)\fR.
.Ip "alarm \s-1SEKUNDY\s0" 8
.IX Item "alarm \s-1SECONDS\s0"
.Ip "alarm" 8
.IX Item "alarm"
Powoduje, że sygnał \s-1ALARM\s0 jest dostarczany do tego procesu po
określonej liczbie sekund. Jeśli nie podano parametru sekund, używana jest
wartość zachowana w \f(CW$_\fR. (Niestety na niektórych maszynach czas może
być do sekundy krótszy niż ten, który podasz, zależnie od sposobu zliczania
sekund.) Naraz odliczać może tylko jeden zegar. Każde wywołanie wyłącza
poprzedni zegar, a argument 0 wyłącza poprzedni zegar bez uruchamiania
nowego. Zwrócona wartość jest ilością czasu, pozostającego poprzedniemu
zegarowi.
.Sp
Dla opóźnień lub większej dokładności niż jedna sekunda, możesz użyć
perlowego interfejsu \fIsyscall()\fR, i dostać się do \fIsetitimer\fR\|(2),
o ile twój system to obsługuje. W przeciwnym wypadku obejrzyj opis
\f(CWselect()\fR, gdzieś w tym dokumencie. Ogólnie częstym błędem jest
łączenie wywołań \fIalarm()\fR i \fIsleep()\fR.
.Sp
Jeśli chcesz używać \fIalarm()\fR do timeout'owania wywołania systemowego,
musisz użyć pary eval/die. Nie można oczekiwać, że alarm spowoduje, że
wywołanie systemowe się zakończy, z $! ustawionym na \s-1EINTR\s0, gdyż na
niektórych systemach perl ustawia obsługę sygnałów tak, że wywołania
systemowe są restartowane. Używanie eval/die działa zawsze.
.Sp
.Vb 13
\& eval {
\& local $SIG{ALRM} = sub { die "alarm\en" }; # NB \en wymagane
\& alarm $timeout;
\& $nread = sysread SOCKET, $buffer, $size;
\& alarm 0;
\& };
\& die if $@ && $@ ne "alarm\en"; # propaguj błędy
\& if ($@) {
\& # timeout
\& }
\& else {
\& # bez timeouta
\& }
.Ve
.Ip "atan2 Y,X" 8
.IX Item "atan2 Y,X"
Zwraca arcus tangens z Y/X, w zakresie \-\*(PI do \*(PI.
.Sp
Dla operacji tangens, możesz użyć funkcji \fI\s-1POSIX::\s0tan()\fR,
lub użyć znanej relacji:
.Sp
.Vb 1
\& sub tan { sin($_[0]) / cos($_[0]) }
.Ve
.Ip "bind \s-1GNIAZDO\s0,\s-1NAZWA\s0" 8
.IX Item "bind \s-1SOCKET\s0,\s-1NAME\s0"
Przywiązuje adres sieciowy do gniazda, podobnie jak wywołanie systemowe
bind(2). Po sukcesie zwraca \s-1TRUE\s0, a w przeciwnym wypadku
\s-1FALSE\s0. \s-1NAZWA\s0 powinna być spakowanym adresem, typu
odpowiedniego dla gniazda. Zobacz przykłady w sekcji
\fISockets: Client/Server Communication\fR na stronie podręcznika
\fIperlipc(1)\fR.
.Ip "binmode \s-1UCHWYTYPLIKU\s0" 8
.IX Item "binmode \s-1FILEHANDLE\s0"
Powoduje, że plik przełącza się w tryb binarny zapisu/odczytu. Ma to miejsce
w systemach operacyjnych, które dokonują takiego rozróżnienia. Pliki, które
nie są w trybie binarnym, ukrywają wejściowe sekwencje \s-1CR\s0 \s-1LF\s0
pod \s-1LF\s0, a sekwencje wyjściowe \s-1LF\s0 są tłumaczone na
\s-1CR\s0 \s-1LF\s0. Tryb binarny nie wpływa na nic pod Unixem; jednak pod
\s-1MS\s0\-\s-1DOS\s0 i innymi archaicznymi systemami, może to być niezbędna
właściwość\*(--w przeciwnym wypadku twoja biblioteka C może zniekształcić
plik. Kluczem do rozróżniania systemów, które potrzebują trybu binarnego od
tych, które go nie potrzebują, jest ich format pliku tekstowego. Systemy
podobne do Unix i Plan9, oddzielają linie pojedynczym znakiem i kodują go w
C jako \*(L'\en\*(R'. Nie potrzebują one trybu binarnego. Wszystkie inne
potrzebują. Jeśli \s-1UCHWYTPLIKU\s0 jest wyrażeniem, to wartość brana jest
jako nazwa uchwytu pliku.
.Ip "bless \s-1REF\s0,\s-1NAZWAKLASY\s0" 8
.IX Item "bless \s-1REF\s0,\s-1CLASSNAME\s0"
.Ip "bless \s-1REF\s0" 8
.IX Item "bless \s-1REF\s0"
Funkcja ta mówi rzeczy, wskazywanej przez referencję \s-1REF\s0, że jest
teraz obiektem
w pakiecie \s-1NAZWAKLASY\s0\*(--lub w bieżącym pakiecie, jeśli nie podano
parametru nazwy klasy. Funkcja zwraca dla pewności referencję, gdyż jest ona
często ostatnią rzeczą w konstruktorze. Jeśli błogosławiona funkcja ma
być dziedziczona w klasach potomnych, to zawsze używaj wersji
dwuargumentowej tej funkcji. Dla dalszych informacji o błogosławieniu
obiektów zobacz stronę \fIperlobj\fR(1).
.Ip "caller \s-1WYRAŻ\s0" 8
.IX Item "caller \s-1EXPR\s0"
.Ip "caller" 8
.IX Item "caller"
Zwraca kontekst bieżącego wywołania podprocedury. W kontekście skalarnym,
jeśli było wywołanie, tj. jeśli jesteśmy w podprocedurze lub \fIeval()\fR
lub \fIrequire()\fR, zwraca nazwę pakietu wywołującego, a w przeciwnym razie
wartość niezdefiniowaną. W kontekście listowym, zwraca
.Sp
.Vb 1
\& ($pakiet, $nazwapliku, $linia) = caller;
.Ve
Z parametrem \s-1WYRAŻ\s0 zwraca trochę dodatkowych danych, z których
korzysta debugger do drukowania śladu stosu. Wartość \s-1WYRAŻ\s0 wskazuje,
o ile ramek wywołań należy się cofnąć od bieżącej.
.Sp
.Vb 2
\& ($pakiet, $nazwapliku, $linia, $podprocedura,
\& $maargumenty, $chcetablię, $teksteval, $jest_require) = caller($i);
.Ve
\f(CW$podprocedura\fR tutaj może być \f(CW"(eval)"\fR, jeśli ramka nie jest
wywołaniem podproceduralnym. W tej sytuacji ustawiane są dodatkowe elementy,
\f(CW$teksteval\fR i \f(CW$jest_require\fR:
\f(CW$jest_require\fR jest prawdziwe, jeśli ramka została utworzona w
instrukcji \f(CWrequire\fR lub \f(CWuse\fR, \f(CW$teksteval\fR
zawiera tekst instrukcji \f(CWeval WYRAŻ\fR.
Praktycznie, dla instrukcji \f(CWeval BLOCK\fR,
\f(CW$nazwapliku\fR to \f(CW"(eval)"\fR, a \f(CW$teksteval\fR jest
niezdefiniowany. (Zauważ też, że każda instrukcja
\f(CWuse\fR tworzy ramkę \f(CWrequire\fR. (wewnątrz ramki \f(CWeval WYRAŻ\fR)
.Sp
Co więcej, po wywołaniu z pakietu \s-1DB\s0, caller zwraca jeszcze
dokładniejsze dane: ustawia zmienną listową \f(CW@DB::args\fR na argumenty,
z którymi wywołano podprocedurę.
.Ip "chdir \s-1WYRAŻ\s0" 8
.IX Item "chdir \s-1EXPR\s0"
Zmienia katalog roboczy na \s-1WYRAŻ\s0. Jeśli \s-1WYRA\s0 jest pominięte,
to zmienia katalog na katalog domowy. Po sukcesie zwraca \s-1TRUE\s0, a w
przeciwnym wypadku \s-1FALSE\s0. Zobacz przykład przy opisie \fIdie()\fR.
.Ip "chmod \s-1LISTA\s0" 8
.IX Item "chmod \s-1LIST\s0"
Zmienia prawa listy plików. Pierwszy element listy musi być numerycznym
zapisem praw, który powinien być liczbą ósemkową, a który z pewnością nie
powinien być łańcuchem cyfr ósemkowych:
\f(CW0644\fR jest ok, ale \f(CW'0644'\fR nie jest. Zwraca liczbę plików,
których prawa zmieniono. Jeśli wszystkim co masz jest łańcuch,
zobacz też wpis \f(CWoct\fR, znajdujący się gdzie indziej w tym dokumencie.
.Sp
.Vb 5
\& $cnt = chmod 0755, 'foo', 'bar';
\& chmod 0755, @executables;
\& $mode = '0644'; chmod $mode, 'foo'; # ustawia prawa na \-\-w\-\-\-\-r\-T!
\& $mode = '0644'; chmod oct($mode), 'foo'; # to jest lepsze
\& $mode = 0644; chmod $mode, 'foo'; # to jest najlepsze
.Ve
.Ip "chomp \s-1ZMIENNA\s0" 8
.IX Item "chomp \s-1VARIABLE\s0"
.Ip "chomp \s-1LISTA\s0" 8
.IX Item "chomp \s-1LIST\s0"
.Ip "chomp" 8
.IX Item "chomp"
Jest to troszkę bezpieczniejsza wersja wpisu \f(CWchop\fR, opisanego gdzie
indziej w tym dokumencie. Usuwa wszelkie zakończenia linii, które
odpowiadają bieżącej wartości \f(CW$/\fR (znanego też jako
\f(CW$INPUT_RECORD_SEPARATOR\fR w module \f(CWEnglish\fR).
Zwraca całkowitą liczbę znaków, usuniętych ze wszystkich argumentów. Często
jest używany do usuwania nowych linii z końca rekordu wejściowego jeśli
obawiasz się, że rekordowi może jej brakować. W trybie `paragraph'
(\f(CW$/ = ""\fR), usuwa wszystkie kończące znaki nowych linii z łańcuchów.
Jeśli pominięta zostanie \s-1ZMIENNA\s0, to ucinane jest \f(CW$_\fR.
Przykład:
.Sp
.Vb 5
\& while (<>) {
\& chomp; # zapobiegaj \en na ostatnim polu
\& @array = split(/:/);
\& ...
\& }
.Ve
Możesz w zasadzie uciąć wszystko co jest lwartością, włączając przypisanie:
.Sp
.Vb 2
\& chomp($cwd = `pwd`);
\& chomp($answer = <STDIN>);
.Ve
Jeśli ucinasz listę, obcinany jest każdy element, a zwracana jest lista
usuniętych znaków.
.Ip "chop \s-1ZMIENNA\s0" 8
.IX Item "chop \s-1VARIABLE\s0"
.Ip "chop \s-1LISTA\s0" 8
.IX Item "chop \s-1LIST\s0"
.Ip "chop" 8
.IX Item "chop"
Odrywa ostatni znak łańcucha i zwraca jego wartość. Jest przede wszystkim
używany do usuwania nowej linii z końca rekordu wejściowego, lecz jest dużo
bardziej efektywny niż \f(CWs/\en//\fR, ponieważ ani nie skanuje, ani nie
kopiuje łańcucha. Jeśli pominięto \s-1ZMIENNĄ\s0, odrywa \f(CW$_\fR.
Przykład:
.Sp
.Vb 5
\& while (<>) {
\& chop; # zapobież \en na ostatnim polu
\& @array = split(/:/);
\& ...
\& }
.Ve
Możesz w zasadzie oderwać cokolwiek, co jest lwartością, włączając
przypisanie:
.Sp
.Vb 2
\& chop($cwd = `pwd`);
\& chop($answer = <STDIN>);
.Ve
Jeśli obrywasz listę, obrywany jest każdy element. Zwracana jest tylko
wartość ostatniego oderwania.
.Sp
Zauważ, że chop zwraca ostatni znak. Aby zwrócić wszystkie poza ostatnim,
użyj \f(CWsubstr($lancuch, 0, \-1)\fR.
.Ip "chown \s-1LISTA\s0" 8
.IX Item "chown \s-1LIST\s0"
Zmienia właściciela (i grupę) listy plików. Pierwsze dwa argumenty listy
muszą być \fI\s-1NUMERYCZNYMI\s0\fR uid i gid, podanym w tej kolejności.
Zwraca liczbę plików, na których powiodła się zamiana.
.Sp
.Vb 2
\& $cnt = chown $uid, $gid, 'foo', 'bar';
\& chown $uid, $gid, @filenames;
.Ve
Oto przykład, który podgląda nienumeryczne uid'y w pliku z hasłami:
.Sp
.Vb 4
\& print "User: ";
\& chop($user = <STDIN>);
\& print "Files: "
\& chop($pattern = <STDIN>);
.Ve
.Vb 2
\& ($login,$pass,$uid,$gid) = getpwnam($user)
\& or die "$user not in passwd file";
.Ve
.Vb 2
\& @ary = <${pattern}>; # rozwiń nazwy plików
\& chown $uid, $gid, @ary;
.Ve
Na większości systemów nie możesz zmieniać właścicielstwa, chyba że jesteś
superużytkownikiem, choć powinieneś być w stanie zmieniać grupę na dowolną z
twoich drugorzędnych grup. Na niezabezpieczonych systemach ograniczenia te
mogą być mniejsze, lecz nie jest to przenośne założenie.
.Ip "chr \s-1LICZBA\s0" 8
.IX Item "chr \s-1NUMBER\s0"
.Ip "chr" 8
.IX Item "chr"
Zwraca znak, reprezentowany przez \s-1LICZBĘ\s0 w zbiorze znaków.
Na przykład, \f(CWchr(65)\fR to \*(L"A\*(R" w \s-1ASCII\s0.
Dla odwrócenia tego działania, użyj \f(CWord\fR, które jest opisane gdzie
indziej w tym dokumencie.
.Sp
Jeśli pominięto \s-1LICZBĘ\s0, to używane jest \f(CW$_\fR.
.Ip "chroot \s-1NAZWAPLIKU\s0" 8
.IX Item "chroot \s-1FILENAME\s0"
.Ip "chroot" 8
.IX Item "chroot"
Funkcja ta działa tak samo jak wywołanie systemowe chroot(2): powoduje, że
podany katalog staje się nowym katalogiem głównym dla wszelkich nowych
ścieżek, które będą się zaczynały od \*(L"/\*(R". Tyczy się to twojego
procesu i jego dzieci. Ze względów bezpieczeństwa, wywołanie to jest
zastrzeżone dla superużytkownika. Jeśli pominięto \s-1NAZWĘPLIKU\s0, to
używany jest \f(CW$_\fR.
.Ip "close \s-1UCHWYTPLIKU\s0" 8
.IX Item "close \s-1FILEHANDLE\s0"
Zamyka plik lub potok związany z uchwytem, zwracając \s-1TRUE\s0 jedynie w
wypadku, gdy stdio da radę opróżnić wszystkie bufory i zamknąć systemowy
deskryptor pliku. Jeśli uchwyt pliku pochodził od otwartego potoku, funkcja
zwróci \s-1FALSE\s0 jeśli któreś z potrzebnych wywołań systemowych
zawiedzie lub jeśli program zakończy pracę z niezerowym statusem. (Jeśli
problemem jest fakt, że program skończył się z niezerowym kodem, to $!
będzie ustawione na 0.)
Nie musisz zamykać \s-1UCHWYTUPLIKU\s0, jeśli chcesz go zaraz potem
wykorzystać do innego otwarcia \fIopen()\fR, ponieważ funkcja \fIopen()\fR
zamknie go za ciebie. Jednak jawne zamknięcie pliku wejściowego resetuje
licznik linii ($.), podczas gdy niejawne zamknięcie w \fIopen()\fR tego nie
robi. Poza tym, zamykanie potoku powoduje oczekiwanie na zakończenie procesu
z potoku, na wypadek gdybyś chciał później obejrzeć wyjście potoku. Jawne
zamykanie potoku wstawia wartość statusu komendy do \f(CW$?\fR. Przykład:
.Sp
.Vb 4
\& open(OUTPUT, '|sort >foo'); # potok do `sort'
\& ... # drukuj różne rzeczy na wyjście
\& close OUTPUT; # czekaj na zakończenie `sort'
\& open(INPUT, 'foo'); # pobierz wyniki sortowania
.Ve
\s-1UCHWYTPLIKU\s0 może być wyrażeniem, którego wartość daje rzeczywistą
nazwę uchwytu pliku.
.Ip "closedir \s-1UCHWYTKATALOGU\s0" 8
.IX Item "closedir \s-1DIRHANDLE\s0"
Zamyka katalog, otworzony funkcją \fIopendir()\fR.
.Ip "connect \s-1GNIAZDO\s0,\s-1NAZWA\s0" 8
.IX Item "connect \s-1SOCKET\s0,\s-1NAME\s0"
Próbuje połączyć się ze zdalnym gniazdem, zupełnie tak jak wywołanie
systemowe connect(2). Po sukcesie zwraca \s-1TRUE\s0, a w przeciwnym wypadku
\s-1FALSE\s0. \s-1NAZWA\s0 powinna być spakowanym typem adresu, odpowiednim
dla gniazda. Zobacz przykłady w sekcji
\fISockets: Client/Server Communication\fR na stronie podręcznika
\fIperlipc\fR(1).
.Ip "continue \s-1BLOK\s0" 8
.IX Item "continue \s-1BLOCK\s0"
W rzeczywistości jest to instrukcja kontroli wykonywania programu, a nie
funkcja. Jeśli do \s-1BLOKU\s0 dołączone jest \f(CWcontinue\fR \s-1BLOK\s0
(zazwyczaj we \f(CWwhile\fR lub \f(CWforeach\fR),
to jest zawsze wykonywany tuż przed kolejnym wykonaniem warunku, zupełnie
jak trzecia część pętli \f(CWfor\fR w C. Tak więc może być używane do
zwiększania zmiennej pętli, nawet gdy pętla była kontynuowana z pomocą
instrukcji \f(CWnext\fR (która jest podobna do instrukcji \f(CWcontinue\fR z C).
.Ip "cos \s-1WYRAŻ\s0" 8
.IX Item "cos \s-1EXPR\s0"
Zwraca cosinus z \s-1WYRAŻ\s0 (wyrażonego w radianach). Jeśli pominie się
argument \s-1WYRAŻ\s0, to używany jest \f(CW$_\fR.
.Sp
Dla operacji arcus cosinus, możesz użyć funkcji \fI\s-1POSIX::\s0acos()\fR,
lub następującej relacji:
.Sp
.Vb 1
\& sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }
.Ve
.Ip "crypt \s-1CZYSTYTEKST\s0,\s-1SALT\s0" 8
.IX Item "crypt \s-1PLAINTEXT\s0,\s-1SALT\s0"
Koduje łańcuch na wzór funkcji \fIcrypt\fR\|(3) z biblioteki C. Może to być
użyteczne np. do sprawdzania plików z hasłami w poszukiwaniu słabych haseł.
Robić to powinni tylko ludzie noszący białe kapelusze.
.Sp
Zauważ, że crypt jest funkcję jednokierunkową, podobnie jak rozbijanie jajek
na omlet. Nie istnieje (znana) funkcja dekodująca. W wyniku, funkcja wcale
nie jest tak użyteczna do kryptografii. (Dla tego, zobacz najbliższy mirror
\s-1CPAN\s0.)
.Sp
Oto przykład, który daje pewność, że ktokolwiek uruchomi ten program, zna
swoje własne hasło:
.Sp
.Vb 2
\& $pwd = (getpwuid($<))[1];
\& $salt = substr($pwd, 0, 2);
.Ve
.Vb 5
\& system "stty \-echo";
\& print "Hasło: ";
\& chop($word = <STDIN>);
\& print "\en";
\& system "stty echo";
.Ve
.Vb 5
\& if (crypt($word, $salt) ne $pwd) {
\& die "Niezmiernie mi przykro...\en";
\& } else {
\& print "ok\en";
\& }
.Ve
Oczywiście wpisywanie swojego hasła za każdym razem, gdy ktoś o nie poprosi
jest niemądre.
.Ip "dbmclose \s-1HASH\s0" 8
.IX Item "dbmclose \s-1HASH\s0"
[Funkcja ta jest przedawniona przez funkcję \fIuntie()\fR.]
.Sp
Przerywa powiązanie między plikiem \s-1DBM\s0 a tablicą asocjacyjną.
.Ip "dbmopen \s-1HASH\s0,\s-1NAZWADB\s0,\s-1PRAWA\s0" 8
.IX Item "dbmopen \s-1HASH\s0,\s-1DBNAME\s0,\s-1MODE\s0"
[funkcja ta jest przedawniona przez funkcję \fItie()\fR.]
.Sp
Łączy to plik \fIdbm\fR\|(3), \fIndbm\fR\|(3), \fIsdbm\fR\|(3), \fIgdbm()\fR,
lub Berkeley \s-1DB\s0 z tablicą asocjacyjną. \s-1HASH\s0 jest nazwą tablicy
asocjacyjnej. (w
przeciwieństwie do normalnego otwierania, pierwszy argument
\fI\s-1NIE\s0\fR jest uchwytem pliku, choć wygląda podobnie). \s-1NAZWADB\s0
jest nazwą bazy danych (bez rozszerzeń w rodzaju \fI.dir\fR czy \fI.pag\fR).
Jeśli baza nie istnieje, to jest tworzona z prawami określanymi przez
\s-1PRAWA\s0 (zmodyfikowanymi przez \fIumask()\fR). Jeśli twój system
obsługuje tylko starsze funkcje \s-1DBM\s0, to możesz w swoim programie
wykonać tylko jeden \fIdbmopen()\fR. W starszych wersjach perla, jeśli
system nie miał ani \s-1DBM\s0, ani ndbm, wywołanie \fIdbmopen\fR
powodowało błąd krytyczny; teraz schodzi do
\fIsdbm\fR\|(3).
.Sp
Jeśli nie masz prawa zapisu do pliku \s-1DBM\s0, to możesz tylko odczytywać
zmienne asocjacyjne, nie możesz ich ustawiać. Jeśli chcesz spróbować, czy możesz
zapisywać, użyj albo testów plikowych, albo spróbuj ustawić próbny wpis
asocjacyjny wewnątrz \fIeval()\fR, co przechwyci błąd.
.Sp
Zauważ, że funkcje takie, jak \fIkeys()\fR i \fIvalues()\fR mogą zwracać
w użyciu z plikami \s-1DBM\s0 wielkie tablice. Możesz do iteracji przez
wielkie pliki \s-1DBM\s0 używać także \fIeach()\fR. Przykład:
.Sp
.Vb 6
\& # drukuj offsety pliku historii
\& dbmopen(%HIST,'/usr/lib/news/history',0666);
\& while (($key,$val) = each %HIST) {
\& print $key, ' = ', unpack('L',$val), "\en";
\& }
\& dbmclose(%HIST);
.Ve
Zobacz też stronę podręcznika \fIAnyDBM_File\fR -- jest tam bardziej ogólny
opis wad i zalet różnych podejść dbm. Zobacz też stronę \fIDB_File\fR, dla
bogatej implementacji.
.Ip "defined \s-1WYRAŻ\s0" 8
.IX Item "defined \s-1EXPR\s0"
.Ip "defined" 8
.IX Item "defined"
Zwraca wartość logiczną, mówiącą czy \s-1WYRAŻ\s0 ma wartość inną od
niezdefiniowanej \f(CWundef\fR. Jeśli \s-1WYRAŻ\s0 nie jest obecne,
to testowane jest \f(CW$_\fR.
.Sp
Wiele operacji zwraca \f(CWundef\fR aby wskazać błąd, koniec pliku, błąd
systemowy, niezainicjalizowaną zmienną i inne wyjątki. Funkcja ta pozwala
odróżnić \f(CWundef\fR od innych wartości. (Prosty test logiczny nie rozróżni
\f(CWundef\fR, zero, pustego łańcucha, i \*(L"0\*(R", które wszystkie są
jednakowo fałszywe.)
Zauważ, że ponieważ \f(CWundef\fR jest prawidłowym skalarem, to jego obecność
\fIniekoniecznie\fR musi wskazywać warunek wyjątkowy: \fIpop()\fR zwraca
\f(CWundef\fR gdy jego argument jest pustą tablicą, \fIlub\fR gdy zwracany
element jest wartością \fCWundef\fR.
.Sp
\fIdefined()\fR można używać też do sprawdzania czy podprocedura wychodzi. Z
drugiej strony, używanie \fIdefined()\fR na agregatach (tablicach
asocjacyjnych i tablicach)
nie musi zwrócić zgodnych z intuicją wyników i powinno się go w tych
przypadkach unikać.
.Sp
Gdy używane na elemencie tablicy asocjacyjnej, mówi czy wartość jest
zdefiniowana, a nie
czy taki klucz istnieje w tablicy. Dla tego celu, użyj \f(CWexists\fR, które
jest opisane gdzie indziej w tym dokumencie.
.Sp
Przykłady:
.Sp
.Vb 6
\& print if defined $switch{'D'};
\& print "$val\en" while defined($val = pop(@ary));
\& die "Can't readlink $sym: $!"
\& unless defined($value = readlink $sym);
\& sub foo { defined &$bar ? &$bar(@_) : die "Brak bar"; }
\& $debugging = 0 unless defined $debugging;
.Ve
Uwaga: Wielu ludzi nadużywa \fIdefined()\fR, a potem są oni zaskoczeni, że
liczba 0 i "" (łańcuch o długości zero) są w rzeczywistości wartościami
zdefiniowanymi. Na przykład, jeśli powiesz
.Sp
.Vb 1
\& "ab" =~ /a(.*)b/;
.Ve
to porównanie wzorca się powiedzie i \f(CW$1\fR będzie zdefiniowane,
niezależnie od tego, że trafiło w "nic". W rzeczywistości nie można
powiedzieć, że trafiło w "nic". Raczej trafiło w coś, o długości zera
znaków. Jest to wszystko bardzo czyste i uczciwe. Gdy funkcja zwraca wartość
niezdefiniowaną, jest to przyznanie się, że nie mogła dać uczciwej
odpowiedzi. Tak więc powinieneś używać \fIdefined()\fR tylko jeśli
sprawdzasz działanie tego, co próbujesz osiągnąć. W niektórych wypadkach,
rzeczą, której oczekujesz jest proste porównanie z 0 lub "".
.Sp
Obecnie używanie \fIdefined()\fR na całej tablicy lub tablicy asocjacyjnej,
zgłasza tylko czy
została dla niego zaalokowana pamięć. Tak więc tablica, którą ustawiasz na
pustą listę jest początkowo niezdefiniowana, a gdy się zapełni, staje się
zdefiniowana. Zamiast tego powinieneś użyć prostego testu rozmiaru:
.Sp
.Vb 2
\& if (@an_array) { print "ma elementy tablicowe\en" }
\& if (%a_hash) { print "ma elementy asocjacyjne\en" }
.Ve
Użycie na nich \fIundef()\fR powoduje wyczyszczenie ich pamięci i
zgłoszenie, że nie są już zdefiniowane. Nie powinno się jednak tego robić,
chyba że nie masz zamiaru ich więcej używać, ponieważ po prostu szybciej
jest używać pamięci gotowej do wypełnienia, niż alokować ją od nowa.
.Sp
Zachowanie \fIdefined()\fR na agregatach może zostać zmienione, poprawione,
lub zepsute w następnych wersjach perla.
.Sp
Zobacz też opisy \f(CWundef\fR, \f(CWexists\fR, i \f(CWref\fR, znajdujące
się w innych miejscach tego dokumentu.
.Ip "delete \s-1WYRAŻ\s0" 8
.IX Item "delete \s-1EXPR\s0"
Kasuje podany \fIklucz\fR\|(e) i związane z nim wartości z tablicy
asocjacyjnej. Dla każdego
klucza, zwracana jest skasowana wartość związana z kluczem albo wartość
niezdefiniowana, jeśli taki klucz nie istniał. Kasowanie z \f(CW$ENV{}\fR
modyfikuje środowisko. Kasowanie z tablicy asocjacyjnej, podłączonej do
pliku \s-1DBM\s0,
kasuje wpis z pliku. (lecz kasowanie z takiego pliku nie musi zwracać
niczego.)
.Sp
Następujący przykład kasuje wszystkie wartości tablicy asocjacyjnej:
.Sp
.Vb 3
\& foreach $key (keys %HASH) {
\& delete $HASH{$key};
\& }
.Ve
Podobnie robi następujące:
.Sp
.Vb 1
\& delete @HASH{keys %HASH}
.Ve
(Ale obydwa są wolniejsze niż komenda \fIundef()\fR.)
Zauważ, że
\s-1WYRAŻ\s0
może być arbitralnie skomplikowany tak długo, dopóki końcowa operacja jest
podejrzeniem elementu asocjacyjnego lub wycinkiem tablicy asocjacyjnej
(`hash slice'):
.Sp
.Vb 2
\& delete $ref->[$x][$y]{$key};
\& delete @{$ref->[$x][$y]}{$key1, $key2, @morekeys};
.Ve
.Ip "die \s-1LISTA\s0" 8
.IX Item "die \s-1LIST\s0"
Poza obrębem \fIeval()\fR drukuje wartość \s-1LISTY\s0 na \f(CWSTDERR\fR
i kończy pracę z bieżącą wartością \f(CW$!\fR (errno). Jeśli \f(CW$!\fR
wynosi 0, to kończy z wartością \f(CW($? >> 8)\fR (status poprzedniej
`komendy`). Jeśli \f(CW($? >> 8)\fR jest zerem, to kończy z wartością 255.
Wewnątrz \fIeval\fR, komunikat o błędzie jest pakowany do \f(CW$@\fR,
a \fIeval()\fR jest przerywany wartością niezdefiniowaną; powoduje to, że
\fIdie()\fR może podnieść wyjątek.
.Sp
Równoważne przykłady:
.Sp
.Vb 2
\& die "Nie mogę przejść do spool: $!\en" unless chdir '/usr/spool/news';
\& chdir '/usr/spool/news' or die "Nie mogę przejść do spool: $!\en"
.Ve
Jeśli wartość \s-1WYRAŻ\s0 nie kończy się nową linią, drukowany jest również
numer bieżącej linii skryptu i wejścia, a za nimi doklejana jest nowa linia.
Wskazówka: Czasami dodanie \*(L", stopped\*(R" do twojego komunikatu może
nadać mu więcej sensu po doklejeniu łańcucha \*(L"at foo line 123\*(R".
Załóżmy, że uruchamiasz skrypt \*(L"canasta\*(R".
.Sp
.Vb 2
\& die "/etc/games is no good";
\& die "/etc/games is no good, stopped";
.Ve
dają w efekcie odpowiednio:
.Sp
.Vb 2
\& /etc/games is no good at canasta line 123.
\& /etc/games is no good, stopped at canasta line 123.
.Ve
Zobacz także \fIexit()\fR i \fIwarn()\fR.
.Sp
Można zaaranżować sprawę tak, że callback będzie wywoływany tuż przed
uczynieniem swojej powinności przez \fIdie()\fR. Należy w tym celu ustawić
hak \f(CW$SIG{__DIE__}\fR. Związany handler zostanie wywołany z tekstem
błędu i może zmienić treść komunikatu błędu, wywołując \fIdie()\fR ponownie.
Zobacz stronę \fIperlvar\fR(1), dla dalszych detali o ustawianiu wpisów
\f(CW%SIG\fR, a także opis \fIeval()\fR dla paru przykładów.
.Ip "do \s-1BLOK\s0" 8
.IX Item "do \s-1BLOCK\s0"
Nie jest to funkcja. Zwraca wartość ostatniej komendy w sekwencji komend,
wskazywanych przez \s-1BLOK\s0. Po zmodyfikowaniu przez modyfikator pętli,
wywołuje jednokrotnie \s-1BLOK\s0 przed sprawdzeniem warunku pętli. (W
innych instrukcjach modyfikatory pętli sprawdzają warunek na samym
początku.)
.Ip "do \s-1PODPROCEDURA\s0(\s-1LISTA\s0)" 8
.IX Item "do \s-1SUBROUTINE\s0(\s-1LIST\s0)"
Niezalecana forma wywołania podprocedury. Zobacz stronę \fIperlsub\fR(1).
.Ip "do \s-1WYRAŻ\s0" 8
.IX Item "do \s-1EXPR\s0"
Używa wartości \s-1WYRAŻ\s0 jako nazwy pliku i wykonuje zawartość tego pliku
jako skrypt perla. Podstawowym zadaniem tej instrukcji jest włączanie
podprocedur z bibliotek perla.
.Sp
.Vb 1
\& do 'stat.pl';
.Ve
jest zupełnie jak
.Sp
.Vb 1
\& eval `cat stat.pl`;
.Ve
tylko trochę bardziej efektywne, utrzymuje śledzenie bieżącej nazwy plików
dla komunikatów o błędach i przeszukuje wszystkie katalogi \fB\-I\fR, jeśli
plik nie znajduje się w katalogu bieżącym (zobacz także tablicę \f(CW@INC\fR
w sekcji \fIPredefined Names\fR podręcznika \fIperlvar\fR(1)).
Jednak jest takie samo w sensie, że przetwarza (parses) plik za każdym razem,
gdy go wywołasz, więc przypuszczalnie nie chciałbyś tego wewnątrz pętli.
.Sp
Zauważ, że włączanie modułów bibliotecznych można załatwić lepiej z pomocą
operatorów \fIuse()\fR i \fIrequire()\fR,
które również dokonują sprawdzania błędów i powodują wyjątki jeśli jest
jakiś problem.
.Ip "dump \s-1ETYKIETA\s0" 8
.IX Item "dump \s-1LABEL\s0"
Powoduje to natychmiastowy zrzut core. Jest to po to, byś mógł użyć programu
\fBundump\fR do konwertowania zrzutu core do pliku binarnego po
zainicjalizowaniu wszystkich zmiennych z początku programu. Po uruchomieniu
nowego binarium, rozpocznie się ono od wywołania
\f(CWgoto ETYKIETA\fR (ze wszystkimi ograniczeniami, na które cierpi
\f(CWgoto\fR). Myśl o tym, jak o goto z interweniującym zrzutem core i
reinkarnacją. Jeśli \s-1ETYKIETA\s0 jest pominięta, program restartuje się
od początku. \s-1UWAGA\s0: wszelkie pliki, które były otwarte w momencie
zrzutu core nie będą otwarte w nowej inkarnacji programu, powodując
przypuszczalnie zamieszanie w części perla. Zobacz też opcję \fB\-u\fR ze
strony \fIperlrun\fR(1).
.Sp
Przykład:
.Sp
.Vb 12
\& #!/usr/bin/perl
\& require 'getopt.pl';
\& require 'stat.pl';
\& %days = (
\& 'Sun' => 1,
\& 'Mon' => 2,
\& 'Tue' => 3,
\& 'Wed' => 4,
\& 'Thu' => 5,
\& 'Fri' => 6,
\& 'Sat' => 7,
\& );
.Ve
.Vb 1
\& dump QUICKSTART if $ARGV[0] eq '\-d';
.Ve
.Vb 2
\& QUICKSTART:
\& Getopt('f');
.Ve
.Ip "each \s-1HASH\s0" 8
.IX Item "each \s-1HASH\s0"
Po wywołaniu w kontekście listowym, zwraca dwuelementową tablicę, składającą
się z klucza i wartości następnego elementu asocjacyjnego, tak że możesz
iterować poprzez tablicę. Po wywołaniu w kontekście skalarnym, zwraca
tylko klucz dla
następnego elementu asocjacyjnego. (Uwaga: Klucze mogą mieć wartość "0" lub "",
co jest
logicznie nieprawidłowe; możesz w tym celu chcieć zapobiec konstrukcjom jak
\f(CWwhile ($k = each %foo) {}\fR .)
.Sp
Wpisy są zwracane w kolejności dość losowej. Gdy tablica asocjacyjna jest
całkowicie odczytana, w
kontekście listowym zwracana jest tablica null (co po przypisaniu daje
wartość \s-1FALSE\s0 (0)), a w kontekście skalarnym zwracany jest
\f(CWundef\fR.
Następne wywołanie \fIeach()\fR po tym rozpocznie iterowanie od nowa.
Dla każdej tablicy asocjacyjnej istnieje pojedynczy iterator, dzielony przez
funkcje \fIeach()\fR, \fIkeys()\fR i \fIvalues()\fR; może być zresetowany
przez odczytanie wszystkich elementów tablicy lub przez wywołanie
\f(CWkeys HASH\fR lub \f(CWvalues HASH\fR.
Jeśli dodajesz, lub kasujesz elementy tablicy asocjacyjnej podczas jej
iterowania, to może
się zdarzyć, że niektóre wpisy utracisz, a niektóre dostaniesz zduplikowane.
Nie rób więc tego.
.Sp
Następujący przykład drukuje środowisko, podobnie jak program
\fIprintenv\fR\|(1), lecz w odwrotnej kolejności:
.Sp
.Vb 3
\& while (($key,$value) = each %ENV) {
\& print "$key=$value\en";
\& }
.Ve
Zobacz też \fIkeys()\fR i \fIvalues()\fR.
.Ip "eof \s-1UCHWYTPLIKU\s0" 8
.IX Item "eof \s-1FILEHANDLE\s0"
.Ip "eof ()" 8
.IX Item "eof ()"
.Ip "eof" 8
.IX Item "eof"
Zwraca 1, jeśli następny odczyt z \s-1UCHWYTUPLIKU\s0 zwróci koniec pliku
(eof) lub jeśli \s-1UCHWYTPLIKU\s0 nie jest otwarty. \s-1UCHWYTPLIKU\s0
może być wyrażeniem, którego wartość daje prawdziwą nazwę uchwytu pliku.
(Zauważ, że ta funkcja w rzeczywistości odczytuje znak, a potem wstawia go z
powrotem, więc nie jest zbyt użyteczna w kontekście interaktywnym.)
Nie czytaj z pliku terminalowego (lub nie wołaj \f(CWeof(UCHWYTPLIKU)\fR)
po osiągnięciu końca pliku. Pliki takie, jak terminale mogą po takim zabiegu
utracić warunek końca pliku.
.Sp
\f(CWeof\fR bez argumentów, używa jako argumentu ostatniego odczytu pliku.
Puste nawiasy () mogą wskazywać na pseudo plik, złożony z plików,
wymienionych w linii komend, np. \f(CWeof()\fR dobrze jest używać wewnątrz
pętli \f(CWwhile (<>)\fR, aby wykryć koniec ostatniego pliku. Przykłady:
.Sp
.Vb 5
\& # resetuj numerowanie linii dla każdego pliku wejściowego
\& while (<>) {
\& print "$.\et$_";
\& close(ARGV) if (eof); # Nie eof().
\& }
.Ve
.Vb 9
\& # wstaw kreski przed ostatnią linią ostatniego pliku
\& while (<>) {
\& if (eof()) {
\& print "--------------\en";
\& close(ARGV); # close or break; is needed if we
\& # are reading from the terminal
\& }
\& print;
\& }
.Ve
Wskazówka praktyczna: w perlu prawie nigdy nie trzeba używać \f(CWeof\fR,
ponieważ operatory wejściowe zwracają undef gdy nie będą miały więcej
danych.
.Ip "eval \s-1WYRAŻ\s0" 8
.IX Item "eval \s-1EXPR\s0"
.Ip "eval \s-1BLOK\s0" 8
.IX Item "eval \s-1BLOCK\s0"
\s-1WYRAŻ\s0 jest przetwarzany i wykonywany tak, jakby był maleńkim
programem perla. Jest wywoływany w kontekście bieżącego programu perla, więc
wszelkie ustawienia zmiennych lub definicje podprocedur i formatów zostają
dalej. Zwracana wartość jest wartością ostatniego wykonanego wyrażenia, lub
wartością, przekazaną przez return, czyli tak jak w podprocedurach. Ostatnie
wyrażenie jest wykonywane w kontekście skalarnym, lub tablicowym, zależnie
od kontekstu eval.
.Sp
Jeśli pojawi się błąd składni lub błąd czasu działania albo jeśli wykonana
zostanie instrukcja \fIdie()\fR, to zwrócona zostanie wartość
niezdefiniowana, a \f(CW$@\fR zostanie ustawione na komunikat o błędzie.
Jeśli nie było błędu, \f(CW$@\fR będzie łańcuchem null.
Jeśli \s-1WYRAŻ\s0 zostanie pominięte, to wykonywane jest \f(CW$_\fR.
Ostatni średnik,
jeśli taki istnieje, może być pominięty w wyrażeniu. Ostrzegam jednak, że
używanie \fIeval()\fR nie wycisza perla od drukowania ostrzeżeń na
\s-1STDERR\s0, ani nie upycha tekstu tych komunikatów do \f(CW$@\fR.
Aby zrobić którąś z tych rzeczy, musisz użyć zabudowania
\f(CW$SIG{__WARN__}\fR. Zobacz \fIwarn()\fR i stronę \fIperlvar\fR(1).
.Sp
Zauważ, że ponieważ \fIeval()\fR przechwytuje krytyczne (w innych wypadkach)
błędy, to jest przydatny dla określania czy konkretna właściwość (taka, jak
np. \fIsocket()\fR, \fIsymlink()\fR, itp. jest zaimplementowana. Jest to
również mechanizm perla obsługiwania wyjątków, gdzie operator die jest
mechanizmem ich podnoszenia.
.Sp
Jeśli wykonywany kod się nie różni, możesz użyć postaci eval-\s-1BLOK\s0 do
wychwytywania błędów czasu działania, bez potrzeby rekompilacji za każdym
razem. Błąd, jeśli się pojawi, jest wciąż zwracany w \f(CW$@\fR.
Przykłady:
.Sp
.Vb 2
\& # spowoduj, by dzielenie przez zero nie było krytyczne
\& eval { $answer = $a / $b; }; warn $@ if $@;
.Ve
.Vb 2
\& # to samo, mniej efektywnie
\& eval '$answer = $a / $b'; warn $@ if $@;
.Ve
.Vb 2
\& # błąd czasu kompilacji
\& eval { $answer = };
.Ve
.Vb 2
\& # błąd czasu działania
\& eval '$answer ='; # ustawia $@
.Ve
Używając postaci eval{} jako pułapki na wyjątki w bibliotekach, możesz nie
życzyć sobie uruchamiania haków \f(CW__DIE__\fR, które mógł sobie ustawić
użytkownik. Dla tego celu można wykorzystać konstrukcję
\f(CWlocal $SIG{__DIE__}\fR. Przykład:
.Sp
.Vb 2
\& # bardzo prywatna pułapka na wyjątek dzielenia przez zero
\& eval { local $SIG{'__DIE__'}; $answer = $a / $b; }; warn $@ if $@;
.Ve
Jest to szczególnie istotne, gdyż haki \f(CW__DIE__\fR mogą wywoływać
\fIdie()\fR ponownie, co ma efekt zmieniania komunikatów o błędach:
.Sp
.Vb 6
\& # haki __DIE__ mogą modyfikować komunikaty o błędach
\& {
\& local $SIG{'__DIE__'} = sub { (my $x = $_[0]) =~ s/foo/bar/g; die $x };
\& eval { die "foo foofs here" };
\& print $@ if $@; # drukuje "bar barfs here"
\& }
.Ve
Używając \fIeval()\fR, powinieneś szczególnie uważać, by pamiętać na co się
patrzy gdy:
.Sp
.Vb 2
\& eval $x; # PRZYPADEK 1
\& eval "$x"; # PRZYPADEK 2
.Ve
.Vb 2
\& eval '$x'; # PRZYPADEK 3
\& eval { $x }; # PRZYPADEK 4
.Ve
.Vb 2
\& eval "\e$$x++" # PRZYPADEK 5
\& $$x++; # PRZYPADEK 6
.Ve
Przypadki 1 i 2 zachowują się jednakowo: uruchamiają kod, zawarty w zmiennej
\f(CW$x\fR. (Chociaż przypadek 2 ma ogłupiające cudzysłowy, powodujące, że
czytelnik zastanawia się, co jeszcze może się zdarzyć (nic nie może).)
Przypadki 3 i 4 zachowują się podobnie: wykonują one kod \*(L'$x\*(R', który
nie robi nic poza zwróceniem wartości \f(CW$x\fR. (Przypadek 4 jest
preferowany ze względów estetycznych, ma też zaletę kompilowania podczas
kompilacji, a nie podczas działania.) Przypadek 5 jest miejscem, gdzie
normalnie chciałbyś użyć cudzysłowów, poza tym, że w tej konkretnej sytuacji
można użyć po prostu symbolicznych referencji. Jest tak w przypadku 6.
.Ip "exec \s-1LISTA\s0" 8
.IX Item "exec \s-1LIST\s0"
Funkcja \fIexec()\fR wykonuje komendę systemową \fI\s-1i\s0 \s-1NIGDY\s0
\s-1NIE\s0 \s-1POWRACA\s0\fR, chyba że komenda nie istnieje i jest
wykonywana bezpośrednio, zamiast przez \f(CW/bin/sh \-c\fR (patrz niżej).
Jeśli chcesz powrócić, użyj zamiast \fIexec()\fR instrukcji \fIsystem()\fR.
.Sp
Jeśli w \s-1LIŚCIE\s0 jest więcej niż jeden argument, lub jeśli jest to
tablica z więcej niż jedną wartością, wywoływany jest
\fIexecvp\fR\|(3) (z argumentami z \s-1LISTY\s0). Jeśli jest tylko jeden
argument skalarny, to jest on sprawdzany w poszukiwaniu metaznaków powłoki.
Jeśli są tam jakieś znaki, to cały argument jest przekazywany do przetworzenia
przez \f(CW/bin/sh \-c\fR.
Jeśli nie ma żadnych metaznaków, to argument jest dzielony na słowa i
przekazywany bezpośrednio do \fIexecvp(3)\fR, co jest bardziej efektywne.
Uwaga: \fIexec()\fR i \fIsystem()\fR nie opróżniają twojego bufora
wejściowego, więc możliwe, że aby zapobiec utracie wyjścia, będziesz musiał
ustawić \f(CW$|\fR. Przykłady:
.Sp
.Vb 2
\& exec '/bin/echo', 'Twoimi argumentami są: ', @ARGV;
\& exec "sort $outfile | uniq";
.Ve
Jeśli tak naprawdę nie potrzebujesz wywołać pierwszego argumentu, lecz
chcesz oszukać program, który wykonujesz co do jego nazwy, to możesz podać
program, który chcesz wywołać jako \*(L"obiekt niebezpośredni\*(R" (bez
przecinka) na samym początku \s-1LISTY\s0. (Wymusza to zawsze interpretację
\s-1LISTY\s0 jako listy wielowartościowej, nawet jeśli jest tam tylko
pojedynczy skalar.) Przykład:
.Sp
.Vb 2
\& $shell = '/bin/csh';
\& exec $shell '\-sh'; # udaj, że to powłoka loginowa
.Ve
lub, bardziej bezpośrednio,
.Sp
.Vb 1
\& exec {'/bin/csh'} '\-sh'; # udaj, że to powłoka loginowy
.Ve
.Ip "exists \s-1WYRAŻ\s0" 8
.IX Item "exists \s-1EXPR\s0"
Zwraca \s-1TRUE\s0, jeśli podany klucz asocjacyjny istnieje w tablicy
asocjacyjnej. Wartość jest prawdziwa nawet gdy odpowiadająca kluczowi
wartość jest niezdefiniowana.
.Sp
.Vb 3
\& print "Istnieje\en" if exists $array{$key};
\& print "Zdefiniowany\en" if defined $array{$key};
\& print "Prawdziwy\en" if $array{$key};
.Ve
Element asocjacyjny może być prawdziwy tylko wtedy, gdy jest zdefiniowany, a
zdefiniowany jeśli istnieje, lecz odwrotna kolejność niekoniecznie jest
prawdziwa.
.Sp
Zauważ, że \s-1WYRAŻ\s0 może być skomplikowany tak daleko, dopóki ostateczna
operacja jest podejrzeniem klucza asocjacyjnego:
.Sp
.Vb 1
\& if (exists $ref->[$x][$y]{$key}) { ... }
.Ve
.Ip "exit \s-1WYRAŻ\s0" 8
.IX Item "exit \s-1EXPR\s0"
Wykonuje \s-1WYRAŻ\s0 i kończy pracę z tą wartością. (W
rzeczywistości, wywołuje najpierw zdefiniowane procedury \f(CWEND\fR, lecz
procedury te mogą przerwać kończenie. Podobnie, również przed wyjściem
wołane są wszelkie destruktory obiektów.) Przykład:
.Sp
.Vb 2
\& $ans = <STDIN>;
\& exit 0 if $ans =~ /^[Xx]/;
.Ve
Zobacz też \fIdie()\fR. Jeśli \s-1WYRAŻ\s0 jest pominięte, to praca kończy
się statusem 0. Jedynymi, uniwersalnymi i przenośnymi wartościami
\s-1WYRAŻ\s0 są 0 dla sukcesu i 1 dla błędu; wszelkie inne są podstawą do
dziwnych interpretacji, zależnych od środowiska, w którym program jest
uruchomiony.
.Sp
Nie powinieneś używać \fIexit()\fR do przerywania podprocedury, jeśli
istnieje szansa, że ktoś mógłby chcieć ustawić pułapkę na błąd. Zamiast tego
użyj \fIdie()\fR, który może być przechwycony przez \fIeval()\fR.
.Ip "exp \s-1WYRAŻ\s0" 8
.IX Item "exp \s-1EXPR\s0"
.Ip "exp" 8
.IX Item "exp"
Zwraca \fIe\fR (naturalna podstawa logarytmu) do potęgi \s-1WYRAŻ\s0. Jeśli
\s-1WYRAŻ\s0 jest pominięte, zwraca \f(CWexp($_)\fR.
.Ip "fcntl \s-1UCHWYTPLIKU\s0,\s-1FUNKCJA\s0,\s-1SKALAR\s0" 8
.IX Item "fcntl \s-1FILEHANDLE\s0,\s-1FUNCTION\s0,\s-1SCALAR\s0"
Implementuje funkcję \fIfcntl\fR\|(2). Przypuszczalnie będziesz musiał
zaznaczyć
.Sp
.Vb 1
\& use Fcntl;
.Ve
aby móc się nią posługiwać. Przetwarzanie argumentów i zwracanie wartości
działa zupełnie jak w \fIioctl()\fR, opisanym niżej. Zauważ, że
\fIfcntl()\fR da błąd krytyczny po użyciu na maszynie, nie implementującej
\fIfcntl\fR\|(2). Na przykład:
.Sp
.Vb 2
\& use Fcntl;
\& fcntl($filehandle, F_GETLK, $packed_return_buffer);
.Ve
.Ip "fileno \s-1UCHWYTPLIKU\s0" 8
.IX Item "fileno \s-1FILEHANDLE\s0"
Zwraca deskryptor pliku dla uchwytu pliku. Jest to przydatne dla
konstruowania bitmap dla \fIselect()\fR. Jeśli \s-1UCHWYTPLIKU\s0 jest
wyrażeniem, to jego wartość brana jest za nazwę uchwytu pliku.
.Ip "flock \s-1UCHWYTPLIKU\s0,\s-1OPERACJA\s0" 8
.IX Item "flock \s-1FILEHANDLE\s0,\s-1OPERATION\s0"
Wywołuje \fIflock\fR\|(2), lub emuluje go dla uchwytu \s-1UCHWYTPLIKU\s0.
Zwraca \s-1TRUE\s0 po sukcesie, \s-1FALSE\s0 w wypadku jakiegoś problemu. Na
maszynach nie implementujących blokowania \fIflock\fR\|(2), \fIfcntl\fR\|(2),
lub \fIlockf\fR\|(3), powoduje błąd krytyczny. \fIflock()\fR
jest przenośnym perlowym interfejsem blokowania plików, choć blokuje tylko
całe pliki, a nie rekordy.
.Sp
\s-1OPERACJA\s0 jest jedną z \s-1LOCK_SH\s0, \s-1LOCK_EX\s0, lub
\s-1LOCK_UN\s0. Możliwa jest jeszcze kombinacja z \s-1LOCK_NB\s0. Stałe te
mają tradycyjne wartości 1, 2, 8 i 4, lecz możesz używać nazw symbolicznych
po zaimportowaniu ich z modułu Fcntl, robiąc to albo pojedynczo, albo
grupowo, używając tagu \*(L':flock\*(R' .
\s-1LOCK_SH\s0 żąda blokady dzielonej, \s-1LOCK_EX\s0 żąda blokady na
wyłączność,
a \s-1LOCK_UN\s0 zwalnia poprzednio zażądaną blokadę. Jeśli do \s-1LOCK_SH\s0
lub \s-1LOCK_EX\s0 dodany zostanie \s-1LOCK_NB\s0, to \fIflock\fR nie będzie
blokował, oczekując na zablokowanie, lecz zakończy działanie natychmiast (aby
dowiedzieć się, czy uzyskałeś blokadę, sprawdź status wyjścia).
.Sp
Aby zapobiec prawdopodobnie dekoordynacji, perl opróżnia \s-1UCHWYTPLIKU\s0
przed jego (od)blokowaniem.
.Sp
Zauważ, że emulacja zbudowana za pomocą \fIlockf\fR(3) nie daje blokad
dzielonych i wymaga, by \s-1UCHWYTPLIKU\s0 był otwarty z zamiarem zapisu.
Jest to semantyka, którą implementuje \fIlockf\fR\|(3). Większość
(wszystkie?) systemów jednak implementuje \fIlockf\fR(3) na zasadach blokowania
\fIfcntl\fR(2), więcej różnice nie powinny się dawać we znaki.
.Sp
Zauważ też, że niektóre wersje \fIflock()\fR nie mogą blokować rzeczy
poprzez sieć; będziesz musiał użyć do tego bardziej specyficznego dla
systemu
\fIfcntl()\fR. Jeśli chcesz, możesz zmusić perla do ignorowania systemowej
funkcji \fIflock\fR(2) i używać jego własnej, opartej o \fIfcntl\fR(2)
emulacji. Robi się to, podając programowi \fIConfigure\fR przełącznik
\f(CW-Ud_flock\fR. Trzeba to oczywiście zrobić podczas konfigurowania perla
jako takiego.
.Sp
Oto doklejacz mailboxa dla systemów \s-1BSD\s0.
.Sp
.Vb 1
\& use Fcntl ':flock'; # importuj stałe LOCK_*
.Ve
.Vb 6
\& sub lock {
\& flock(MBOX,LOCK_EX);
\& # a w wypadku, gdyby ktoś dokleił
\& # podczas naszego oczekiwania...
\& seek(MBOX, 0, 2);
\& }
.Ve
.Vb 3
\& sub unlock {
\& flock(MBOX,LOCK_UN);
\& }
.Ve
.Vb 2
\& open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}")
\& or die "Nie mogę otworzyć mailboxa!: $!";
.Ve
.Vb 3
\& lock();
\& print MBOX $msg,"\en\en";
\& unlock();
.Ve
Zobacz też stronę podręcznika. Są tam inne przykłady \fIflock()\fR.
.Ip "fork" 8
.IX Item "fork"
Wykonuje wywołanie systemowe \fIfork\fR\|(2). Zwraca procesowi
rodzicielskiemu pid dziecka, a w wątku dziecka zwraca zero. W wypadku błędu,
zwraca \f(CWundef\fR.
Uwaga: nieopróżnione bufory pozostają nieopróżnione w obydwu procesach, co
znaczy, że będziesz musiał ustawić
\f(CW$|\fR ($\s-1AUTOFLUSH\s0 w English) lub wywołać metodę \fIautoflush()\fR
z \s-1IO::\s0Handle aby zapobiec duplikacji wyjścia.
.Sp
Jeśli \fIfork()\fR'ujesz bez czekania na dzieci, zbierzesz zombies.
(Osierocone procesy.)
.Sp
.Vb 1
\& $SIG{CHLD} = sub { wait };
.Ve
Istnieje też trik podwójnego forka (sprawdzanie błędów forka zostało
pominięte);
.Sp
.Vb 11
\& unless ($pid = fork) {
\& unless (fork) {
\& exec "co naprawdę chcesz robić";
\& die "bez exec";
\& # ... or ...
\& ## (jakiś_kod_perla)
\& exit 0;
\& }
\& exit 0;
\& }
\& waitpid($pid,0);
.Ve
Zobacz też stronę podręcznika \fIperlipc\fR(1). Są tam dalsze przykłady
forkowania i zbierania konających dzieci.
.Sp
Zauważ, że jeśli twoje forkowane dziecko dziedziczy systemowe deskryptory
plików, takie jak \s-1STDIN\s0 i \s-1STDOUT\s0, które w rzeczywistości są
połączone potokiem lub gniazdem, to jeśli skończysz działanie, zdalny
serwer (taki jak httpd, rsh) nie będzie myślał, że rzeczywiście skończyłeś.
Powinieneś je otworzyć na nowo na /dev/null.
.Ip "format" 8
.IX Item "format"
Zadeklaruj format obrazka, używanego z funkcją \fIwrite()\fR. Na przykład:
.Sp
.Vb 4
\& format Something =
\& Test: @<<<<<<<< @||||| @>>>>>
\& $str, $%, '$' . int($num)
\& .
.Ve
.Vb 4
\& $str = "widget";
\& $num = $cost/$quantity;
\& $~ = 'Something';
\& write;
.Ve
Dla dalszych opisów i przykładów, zobacz stronę \fIperlform\fR(1).
.Ip "formline \s-1OBRAZEK\s0,\s-1LISTA\s0" 8
.IX Item "formline \s-1PICTURE\s0,\s-1LIST\s0"
Jest to funkcja wewnętrzna, używana przez \f(CWformat\fRy. Można ją jednak
wywołać też samodzielnie. Formatuje ona (zobacz stronę \fIperlform\fR(1))
listę wartości zależnie od zawartości \s-1OBRAZKA\s0, umieszczając wyjście w
akumulatorze wyjścia formatowego, \f(CW$^A\fR (\f(CW$ACCUMULATOR\fR w English).
Ostatecznie, po dokonaniu \fIwrite()\fR, zawartość
\f(CW$^A\fR jest zapisywana do jakiegoś uchwytu pliku. Możesz jednak
odczytać go samodzielnie i ustawić na "". Zauważ, że format zazwyczaj
wykonuje jeden \fIformline()\fR na każdą linię formy, lecz sama funkcja
\fIfromline\fR nie zwraca uwagi na to, ile nowych linii jest osadzonych w
\s-1OBRAZKU\s0. Znaczy to, że tokeny \f(CW~\fR i \f(CW~~\fR będą traktować
cały \s-1OBRAZEK\s0 jako linię pojedynczą. Możesz więc być zmuszonym do
używania wielu linii form, aby zaimplementować pojedynczy format zapisu,
podobnie jak kompilator format.
.Sp
Uważaj, jeśli wstawiasz wokół obrazka podwójne cudzysłowy--znak
\*(L"\f(CW@\fR\*(R" może być wzięty za początek nazwy tablicy.
\fIformline()\fR zawsze zwraca \s-1TRUE\s0. Zobacz stronę \fIperlform\fR(1) dla
dalszych przykładów.
.Ip "getc \s-1UCHWYTPLIKU\s0" 8
.IX Item "getc \s-1FILEHANDLE\s0"
.Ip "getc" 8
.IX Item "getc"
Zwraca następny znak z pliku wejściowego, identyfikowanego przez
\s-1UCHWYTPLIKU\s0. Na końcu pliku zwraca łańcuch null. Jeśli
\s-1UCHWYTPLIKU\s0 zostanie pominięty, odczyt następuje ze \s-1STDIN\s0.
Nie jest to efektywne. Nie może być używane do pobierania niebuforowanych
pojedynczych znaków. Do tego celu spróbuj raczej czegoś w rodzaju:
.Sp
.Vb 6
\& if ($BSD_STYLE) {
\& system "stty cbreak </dev/tty >/dev/tty 2>&1";
\& }
\& else {
\& system "stty", '\-icanon', 'eol', "\e001";
\& }
.Ve
.Vb 1
\& $key = getc(STDIN);
.Ve
.Vb 7
\& if ($BSD_STYLE) {
\& system "stty \-cbreak </dev/tty >/dev/tty 2>&1";
\& }
\& else {
\& system "stty", 'icanon', 'eol', '^@'; # ASCII null
\& }
\& print "\en";
.Ve
Określenie, czy \f(CW$BSD_STYLE\fR powinno być ustawione, pozostawiamy jako
ćwiczenie dla czytelnika.
.Sp
Na systemach, kompatybilnych z \s-1POSIX\s0, bardziej przenośna do tego
celu może być funkcja \fI\s-1POSIX::\s0getattr()\fR.
Zobacz też moduł \f(CWTerm::ReadKey\fR z najbliższego mirrora \s-1CPAN\s0;
szczegóły o \s-1CPAN\s0 można znaleźć we wpisie \f(CWCPAN\fR ze strony
podręcznika \fIperlmod\fR(1).
.Ip "getlogin" 8
.IX Item "getlogin"
Zwraca bieżący login z \fI/etc/utmp\fR. (o ile istnieje.)
W wypadku nulla, użyj \fIgetpwuid()\fR.
.Sp
.Vb 1
\& $login = getlogin || getpwuid($<) || "Kilroy";
.Ve
Nie wykorzystuj \fIgetlogin()\fR do autentykacji: nie jest tak bezpieczny
jak \fIgetpwuid()\fR.
.Ip "getpeername \s-1GNIZADO\s0" 8
.IX Item "getpeername \s-1SOCKET\s0"
Zwraca spakowany adres sockaddr drugiego końca z połączenia na
\s-1GNIEŹDZIE\s0.
.Sp
.Vb 5
\& use Socket;
\& $hersockaddr = getpeername(SOCK);
\& ($port, $iaddr) = unpack_sockaddr_in($hersockaddr);
\& $herhostname = gethostbyaddr($iaddr, AF_INET);
\& $herstraddr = inet_ntoa($iaddr);
.Ve
.Ip "getpgrp \s-1PID\s0" 8
.IX Item "getpgrp \s-1PID\s0"
Zwraca bieżącą grupę procesu dla podanego \s-1PID\s0a. Aby uzyskać
grupę bieżącego procesu, użyj wartości \s-1PID\s0 równej zero.
Użycie tej funkcji na maszynie, nie implementującej \fIgetpgrp\fR\|(2)
podniesie wyjątek. Jeśli parametr \s-1PID\s0 zostanie pominięty, to zwracana
jest grupa bieżącego procesu. Zauważ, że wersja \s-1POSIX\s0 \fIgetpgrp\fR
nie przyjmuje argumentu \s-1PID\s0, więc naprawdę przenośna jest tylko
konstrukcja \s-1PID\s0==0.
.Ip "getppid" 8
.IX Item "getppid"
Zwraca identyfikator procesu rodzicielskiego.
.Ip "getpriority \s-1CZYJE\s0,\s-1KTO\s0" 8
.IX Item "getpriority \s-1WHICH\s0,\s-1WHO\s0"
Zwraca bieżący priorytet procesu, grupy procesów, lub użytkownika. (Zobacz
stronę podręcznika \fIgetpriority(2)\fR.)
Użycie tej funkcji na maszynie nie implementującej \fIgetpriority\fR\|(2)
podniesie wyjątek krytyczny.
.Ip "getpwnam \s-1NAZWA\s0" 8
.IX Item "getpwnam \s-1NAME\s0"
.Ip "getgrnam \s-1NAZWA\s0" 8
.IX Item "getgrnam \s-1NAME\s0"
.Ip "gethostbyname \s-1NAZWA\s0" 8
.IX Item "gethostbyname \s-1NAME\s0"
.Ip "getnetbyname \s-1NAZWA\s0" 8
.IX Item "getnetbyname \s-1NAME\s0"
.Ip "getprotobyname \s-1NAZWA\s0" 8
.IX Item "getprotobyname \s-1NAME\s0"
.Ip "getpwuid \s-1UID\s0" 8
.IX Item "getpwuid \s-1UID\s0"
.Ip "getgrgid \s-1GID\s0" 8
.IX Item "getgrgid \s-1GID\s0"
.Ip "getservbyname \s-1NAZWA\s0,\s-1PROTO\s0" 8
.IX Item "getservbyname \s-1NAME\s0,\s-1PROTO\s0"
.Ip "gethostbyaddr \s-1ADR\s0,\s-1TYPADRESU\s0" 8
.IX Item "gethostbyaddr \s-1ADDR\s0,\s-1ADDRTYPE\s0"
.Ip "getnetbyaddr \s-1ADR\s0,\s-1TYPADRESU\s0" 8
.IX Item "getnetbyaddr \s-1ADDR\s0,\s-1ADDRTYPE\s0"
.Ip "getprotobynumber \s-1LICZBA\s0" 8
.IX Item "getprotobynumber \s-1NUMBER\s0"
.Ip "getservbyport \s-1PORT\s0,\s-1PROTO\s0" 8
.IX Item "getservbyport \s-1PORT\s0,\s-1PROTO\s0"
.Ip "getpwent" 8
.IX Item "getpwent"
.Ip "getgrent" 8
.IX Item "getgrent"
.Ip "gethostent" 8
.IX Item "gethostent"
.Ip "getnetent" 8
.IX Item "getnetent"
.Ip "getprotoent" 8
.IX Item "getprotoent"
.Ip "getservent" 8
.IX Item "getservent"
.Ip "setpwent" 8
.IX Item "setpwent"
.Ip "setgrent" 8
.IX Item "setgrent"
.Ip "sethostent \s-1STAYOPEN\s0" 8
.IX Item "sethostent \s-1STAYOPEN\s0"
.Ip "setnetent \s-1STAYOPEN\s0" 8
.IX Item "setnetent \s-1STAYOPEN\s0"
.Ip "setprotoent \s-1STAYOPEN\s0" 8
.IX Item "setprotoent \s-1STAYOPEN\s0"
.Ip "setservent \s-1STAYOPEN\s0" 8
.IX Item "setservent \s-1STAYOPEN\s0"
.Ip "endpwent" 8
.IX Item "endpwent"
.Ip "endgrent" 8
.IX Item "endgrent"
.Ip "endhostent" 8
.IX Item "endhostent"
.Ip "endnetent" 8
.IX Item "endnetent"
.Ip "endprotoent" 8
.IX Item "endprotoent"
.Ip "endservent" 8
.IX Item "endservent"
Funkcje te dokonują tych samych akcji, co ich odpowiedniki z biblioteki
systemowej. W kontekście listowym, wartości zwracane różnych funkcji `get'
są następujące:
.Sp
.Vb 7
\& ($nazwa,$hasło,$uid,$gid,
\& $quota,$komentarz,$gcos,$katalog,$shell) = getpw*
\& ($nazwa,$hasło,$gid,$członkowie) = getgr*
\& ($nazwa,$aliasy,$typadresu,$długość,@addrs) = gethost*
\& ($nazwa,$aliasy,$typadresu,$sieć) = getnet*
\& ($nazwa,$aliasy,$protokół) = getproto*
\& ($nazwa,$aliasy,$port,$protokół) = getserv*
.Ve
(Jeśli wpis nie istnieje, dostaniesz listę null.)
.Sp
W kontekście skalarnym, dostajesz nazwę. Wyjątkiem jest funkcja podglądania
według nazwy, gdzie dostajesz inną rzecz, jaką by ona nie była.
(Jeśli wpis nie istnieje, otrzymujesz wartość niezdefiniowaną.) Na
przykład:
.Sp
.Vb 7
\& $uid = getpwnam
\& $nazwa = getpwuid
\& $nazwa = getpwent
\& $gid = getgrnam
\& $nazwa = getgrgid
\& $nazwa = getgrent
\& itd.
.Ve
Wartość \f(CW$członkowie\fR, zwracana przez \fIgetgr*()\fR to oddzielona
spacjami lista nazw loginowych członków grupy.
.Sp
Jeśli w C obsługiwana jest zmienna errno, to dla funkcji \fIgethost*()\fR
jego wartość będzie przekazywana przez \f(CW$?\fR. Wartość \f(CW@addrs\fR,
zwracana przez wykonane wywołanie, jest listą czystych (raw) adresów,
zwróconych przez odpowiednie wywołanie systemowe. W domenie internetowej,
każdy adres jest czterobajtowy, a rozpakować go możesz, mówiąc coś w
rodzaju:
.Sp
.Vb 1
\& ($a,$b,$c,$d) = unpack('C4',$addr[0]);
.Ve
.Ip "getsockname \s-1GNIAZDO\s0" 8
.IX Item "getsockname \s-1SOCKET\s0"
Zwraca spakowany adres sockaddr tego końca połączenia na \s-1GNIEŹDZIE\s0.
.Sp
.Vb 3
\& use Socket;
\& $mysockaddr = getsockname(SOCK);
\& ($port, $myaddr) = unpack_sockaddr_in($mysockaddr);
.Ve
.Ip "getsockopt \s-1GNIAZDO\s0,\s-1POZIOM\s0,\s-1NAZWAOPCJI\s0" 8
.IX Item "getsockopt \s-1SOCKET\s0,\s-1LEVEL\s0,\s-1OPTNAME\s0"
Zwraca zażądaną opcję gniazda, lub wartość niezdefiniowaną w wypadku błędu.
.Ip "glob \s-1WYRAŻ\s0" 8
.IX Item "glob \s-1EXPR\s0"
.Ip "glob" 8
.IX Item "glob"
Zwraca wartość \s-1WYRAŻ\s0 z rozwinięciami nazwy plików, takimi jakich
dokonałaby powłoka. Funkcja ta jest wewnętrzną funkcją implementującą operator
\f(CW<*.c>\fR, lecz możesz jej użyć bezpośrednio. Jeśli pominięte zostanie
\s-1WYRAŻ\s0, to używane będzie \f(CW$_\fR.
Operator \f(CW<*.c>\fR jest omówiony bliżej w sekcji \fII/O Operators\fR na
stronie \fIperlop\fR(1).
.Ip "gmtime \s-1WYRAŻ\s0" 8
.IX Item "gmtime \s-1EXPR\s0"
Konwertuje czas zwrócony przez funkcję time do 9 elementowej tablicy, w
której znajduje się czas zlokalizowany do standardowej strefy Greenwich.
Zazwyczaj jest to używane następująco:
.Sp
.Vb 3
\& # 0 1 2 3 4 5 6 7 8
\& ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
\& gmtime(time);
.Ve
Wszystkie elementy tablicy są numeryczne i pochodzą wprost ze struktury tm.
Ogólnie znaczy to, że \f(CW$mon\fR ma zakres 0..11, a \f(CW$wday\fR 0..6, z
niedzielą kryjącą się pod 0. Dodatkowo, \f(CW$year\fR jest liczbą lat od
1900, a \fInie\fR po prostu dwiema ostatnimi cyframi roku.
.Sp
Jeśli \s-1WYRAŻ\s0 jest pominięte, wykonuje \f(CWgmtime(time())\fR.
.Sp
W kontekście skalarnym, zwraca wartość \fIctime\fR\|(3):
.Sp
.Vb 1
\& $now_string = gmtime; # np. "Thu Oct 13 04:54:34 1994"
.Ve
Zobacz też funkcję \fItimegm()\fR, udostępnianą przez moduł Time::Local, a
także funkcję \fIstrftime\fR\|(3), dostępną przez moduł \s-1POSIX\s0.
.Ip "goto \s-1ETYKIETA\s0" 8
.IX Item "goto \s-1LABEL\s0"
.Ip "goto \s-1WYRAŻ\s0" 8
.IX Item "goto \s-1EXPR\s0"
.Ip "goto &\s-1NAZWA\s0" 8
.IX Item "goto &\s-1NAME\s0"
Postać goto-\s-1ETYKIETA\s0 szuka instrukcji, oznaczonej przez
\s-1ETYKIETA\s0 i kontynuuje działanie od tamtego miejsca. Nie może być
używane do przechodzenia do konstrukcji, wymagającej inicjalizacji, takiej
jak podprocedura czy pętla foreach. Nie może też być używane do
przechodzenia do konstrukcji optymalizowanej, lub do wychodzenia z bloku,
lub podprocedury, przekazanej do \fIsort()\fR.
Można nim natomiast przeskoczyć prawie we wszystkie inne miejsca zakresu
dynamicznego, włączając wychodzenie z podprocedur, choć w tym wypadku lepiej
użyć innej konstrukcji, takiej jak last lub die. Autor perla nigdy nie czuł
potrzeby używania tej postaci goto (tzn. w perlu\*(--C jest inną sprawą).
.Sp
Postać goto-\s-1WYRAŻ\s0 oczekuje nazwy etykiety, której zakres może być
rozwiązany dynamicznie. Pozwala to na obliczane goto per \s-1FORTRAN\s0,
lecz nie jest zbyt zalecane, jeśli optymalizujesz ze względu na łatwość
konserwacji programu:
.\" maintainowanie:
.Sp
.Vb 1
\& goto ("FOO", "BAR", "GLARCH")[$i];
.Ve
Postać goto-&\s-1NAZWA\s0 jest bardzo magiczna i podmienia wywołanie do
nazwanej podprocedury dla bieżącej procedury. Jest to używane przez
podprocedury \s-1AUTOLOAD\s0, które chcą ładować inne podprocedury, a potem
udawać, że ta inna podprocedura została wywołana jako pierwsza (poza tym,
wszelkie zmiany \f(CW@_\fR bieżącej podprocedury są przekazywane innej
podprocedurze.) Po tym goto, nawet \fIcaller()\fR nie będzie w stanie
powiedzieć, że ta procedura była wywołana pierwsza.
.Ip "grep \s-1BLOK\s0 \s-1LISTA\s0" 8
.IX Item "grep \s-1BLOCK\s0 \s-1LIST\s0"
.Ip "grep \s-1WYRAŻ\s0,\s-1LISTA\s0" 8
.IX Item "grep \s-1EXPR\s0,\s-1LIST\s0"
Jest to podobne duchowo, lecz nie identyczne do \fIgrep\fR\|(1) i krewnych.
W rzeczywistości, nie jest ograniczone do używania wyrażeń regularnych.
.Sp
Wykonuje \s-1BLOK\s0 lub \s-1WYRAŻ\s0 dla każdego elementu \s-1LISTY\s0
(ustawiając lokalnie \f(CW$_\fR na każdy element) i zwracając listę
wartości, składających się z tych, dla których wykonane wyrażenie było
prawdziwe. W kontekście skalarnym, zwraca liczbę prawdziwych wyrażeń.
.Sp
.Vb 1
\& @foo = grep(!/^#/, @bar); # Pozbądź się komentarzy
.Ve
lub równoważnie,
.Sp
.Vb 1
\& @foo = grep {!/^#/} @bar; # pozbądź się komentarzy
.Ve
Zauważ, że skoro \f(CW$_\fR jest referencją do wartości listy, może być
używane do modyfikowania elementów tablicy. Podczas gdy jest to przydatne i
obsługiwane, może to spowodować też nieoczekiwane rezultaty, szczególnie w
wypadku gdy \s-1LISTA\s0 nie jest nazwaną tablicą.
.Sp
Grep zwraca aliasy do oryginalnej listy. Znaczy to, że modyfikowanie
elementu listy zwróconej przez to polecenie, modyfikuje też element listy
oryginalnej.
.Ip "hex \s-1WYRAŻ\s0" 8
.IX Item "hex \s-1EXPR\s0"
.Ip "hex" 8
.IX Item "hex"
Interpretuje \s-1WYRAŻ\s0 jako łańcuch szesnastkowy i zwraca odpowiadającą mu
wartość. (Dla konwersji łańcuchów, które mogą się zaczynać od 0, lub 0x,
zobacz opis \f(CWoct\fR, znajdujący się gdzieś w tym dokumencie.) Jeśli
\s-1WYRAŻ\s0 zostanie pominięte, to używane jest \f(CW$_\fR.
.Sp
.Vb 2
\& print hex '0xAf'; # drukuje '175'
\& print hex 'aF'; # to samo
.Ve
.Ip "import" 8
.IX Item "import"
Nie istnieje wbudowana funkcja \fIimport\fR. Jest to zwyczajna metoda
(podprocedura), definiowana (dziedziczona) przez moduły, które życzą sobie
eksportować nazwy do kolejnych modułów. [potem] funkcja \f(CWuse()\fR woła
metodę \fIimport()\fR dla używanego pakietu. Zobacz jeszcze opis \f(CWuse()\fR
i stronę \fIperlmod\fR(1) oraz stronę \fIExporter\fR.
.Ip "index \s-1STR\s0,\s-1SUBSTR\s0,\s-1POZYCJA\s0" 8
.IX Item "index \s-1STR\s0,\s-1SUBSTR\s0,\s-1POSITION\s0"
.Ip "index \s-1STR\s0,\s-1SUBSTR\s0" 8
.IX Item "index \s-1STR\s0,\s-1SUBSTR\s0"
Zwraca pozycję pierwszego pojawienia się \s-1SUBSTR\s0 w łańcuchu \s-1STR\s0.
Jeśli \s-1POZYCJA\s0 jest pominięta, to przeszukiwanie rozpoczyna się od
początku łańcucha. Wartość zwracana jest oparta o 0 (lub tego, na co ustawisz
zmienną \f(CW$[\fR \*(--lecz lepiej tego nie rób). Jeśli podciąg nie może
zostać zlokalizowany, zwracana jest podstawa - 1, czyli normalnie \-1.
.Ip "int \s-1WYRAŻ\s0" 8
.IX Item "int \s-1EXPR\s0"
.Ip "int" 8
.IX Item "int"
Zwraca część całkowitą z \s-1WYRAŻ\s0. Jeśli \s-1WYRAŻ\s0 jest pominięte,
używane jest \f(CW$_\fR.
.Ip "ioctl \s-1UCHWYTPLIKU\s0,\s-1FUNKCJA\s0,\s-1SKALAR\s0" 8
.IX Item "ioctl \s-1FILEHANDLE\s0,\s-1FUNCTION\s0,\s-1SCALAR\s0"
Implementuje funkcję \fIioctl\fR\|(2). Przypuszczalnie aby jej używać,
będziesz musiał powiedzieć
.Sp
.Vb 1
\& require "ioctl.ph"; # przypuszczalnie w /usr/local/lib/perl/ioctl.ph
.Ve
Jeśli \fIioctl.ph\fR nie istnieje, lub nie ma właściwych definicji, będziesz
musiał użyć swojej własnej, opartej na nagłówkach C, takich jak
\fI<sys/ioctl.h>\fR.
(Istnieje skrypt perla o nazwie \fBh2ph\fR(1), która pomaga w konwersji,
lecz jest to nietrywialna sprawa.) \s-1SKALAR\s0 jest wartością zapisywaną,
lub odczytywaną, zależnie od \s-1FUNKCJI\s0\*(--wskaźnik do wartości
łańcuchowej \s-1SKALARA\s0 będzie przekazany jako trzeci argument właściwego
wywołania ioctl. (Jeśli \s-1SKALAR\s0 nie ma wartości łańcuchowej, lecz ma
numeryczną, to zostanie przekazana ta wartość zamiast wskaźnika do
łańcucha. Aby zapewnić, że będzie to prawdziwe, przed użyciem dodaj do
skalara 0). Do manipulowania na wartościach struktur, używanych przez
\fIioctl()\fR przydatne są funkcje \fIpack()\fR i \fIunpack()\fR.
Następujący przykład ustawia znak kasowania na \s-1DEL\s0.
.Sp
.Vb 11
\& require 'ioctl.ph';
\& $getp = &TIOCGETP;
\& die "NO TIOCGETP" if $@ || !$getp;
\& $sgttyb_t = "ccccs"; # 4 znaki i short
\& if (ioctl(STDIN,$getp,$sgttyb)) {
\& @ary = unpack($sgttyb_t,$sgttyb);
\& $ary[2] = 127;
\& $sgttyb = pack($sgttyb_t,@ary);
\& ioctl(STDIN,&TIOCSETP,$sgttyb)
\& || die "Nie mogę wykonać ioctl: $!";
\& }
.Ve
Wartość zwracana ioctl (i fcntl) jest następująca:
.Sp
.Vb 4
\& gdy OS zwraca: to Perl zwraca:
\& \-1 wartość niezdefiniowaną
\& 0 łańcuch "0 but true"
\& coś innego to samo
.Ve
Tak więc, mimo że perl zwraca po sukcesie \s-1TRUE\s0, a w wypadku
niepowodzenia \s-1FALSE\s0, możesz łatwo określić rzeczywistą wartość
zwróconą przez system operacyjny:
.Sp
.Vb 2
\& ($retval = ioctl(...)) || ($retval = \-1);
\& printf "System zwrócił %d\en", $retval;
.Ve
.Ip "join \s-1WYRAŻ\s0,\s-1LISTA\s0" 8
.IX Item "join \s-1EXPR\s0,\s-1LIST\s0"
Łączy osobne łańcuchy \s-1LISTY\s0 w pojedynczy łańcuch, w którym pola są
rozdzielone wartościami \s-1WYRAŻ\s0. Zwraca ten łańcuch.
Przykład:
.Sp
.Vb 1
\& $_ = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell);
.Ve
Zobacz też opis \f(CWsplit\fR.
.Ip "keys \s-1HASH\s0" 8
.IX Item "keys \s-1HASH\s0"
Zwraca normalna tablicę, składającą się z wszystkich kluczy nazwanej tablicy
asocjacyjnej. (W kontekście skalarnym, zwraca liczbę kluczy.) Klucze są
zwracane w dość losowej kolejności, lecz w tej samej, w której swoje
wartości produkują funkcje \fIvalues()\fR i \fIeach()\fR (o ile tablica
asocjacyjna nie była [w międzyczasie] zmieniana).
W efekcie ubocznym, funkcja resetuje iterator tablicy.
.Sp
A oto jeszcze inny sposób na wydrukowanie środowiska:
.Sp
.Vb 5
\& @keys = keys %ENV;
\& @values = values %ENV;
\& while ($#keys >= 0) {
\& print pop(@keys), '=', pop(@values), "\en";
\& }
.Ve
a co, jeśli by je posortować według klucza:
.Sp
.Vb 3
\& foreach $key (sort(keys %ENV)) {
\& print $key, '=', $ENV{$key}, "\en";
\& }
.Ve
Aby posortować tablicę według wartości, będziesz musiał użyć funkcji
\f(CWsort\fR. Oto numeryczne posortowanie tablicy asocjacyjnej według jej
wartości:
.Sp
.Vb 3
\& foreach $key (sort { $hash{$b} <=> $hash{$a} } keys %hash)) {
\& printf "%4d %s\en", $hash{$key}, $key;
\& }
.Ve
Jako lwartość, \f(CWkeys\fR umożliwia zwiększanie liczby komórek
asocjacyjnych, zaalokowanych dla danej tablicy asocjacyjnej. Możesz zyskać
na efektywności, jeśli tablica ma być duża. (Jest to podobne do
pre-rozszerzania tablicy przez przeznaczanie $#array większego numeru.)
Jeśli powiesz
.Sp
.Vb 1
\& keys %hash = 200;
.Ve
to \f(CW%hash\fR będzie miał co najmniej 200 zaalokowanych komórek. Komórki
te będą utrzymywane nawet, jeśli zrobisz \f(CW%hash = ()\fR. Jeśli chcesz
zwolnić zasób wewnątrz zakresu, użyj \f(CWundef %hash\fR.
Korzystając z powyższej właściwości, zawsze można zmniejszyć liczbę
zaalokowanych komórek.
.Ip "kill \s-1LISTA\s0" 8
.IX Item "kill \s-1LIST\s0"
Wysyła sygnał do listy procesów. Pierwszy element listy musi być nazwą
sygnału. Zwraca liczbę procesów, do których udało się przesłać sygnał.
.Sp
.Vb 2
\& $cnt = kill 1, $child1, $child2;
\& kill 9, @goners;
.Ve
W przeciwieństwie do zachowania w powłoce, w perlu jeśli \fI-1SYGNAŁ\s0\fR
jest ujemny, to killuje grupy procesów, zamiast procesów. (W Systemie V,
ujemny numer \fI\s-1PROCESU\s0\fR odnosi się też do grup procesów, lecz nie
jest to przenośne.) Oznacza to, że zazwyczaj chcesz przekazywać sygnały
dodatnie. Możesz też używać nazw sygnałów w cudzysłowach. Zobacz jeszcze sekcję
\fISignals\fR w podręczniku \fIperlipc\fR(1).
.Ip "last \s-1ETYKIETA\s0" 8
.IX Item "last \s-1LABEL\s0"
.Ip "last" 8
.IX Item "last"
Komenda \f(CWlast\fR jest podobna do instrukcji \f(CWbreak\fR z C (używanej
w pętlach); przerywa natychmiastowo pętlę. Jeśli pominięty jest parametr
\s-1ETYKIETY\s0, to komenda odnosi się do najbardziej wewnętrznej pętli
zamykającej. Potencjalna instrukcja bloku \f(CWcontinue\fR nie jest
wykonywana:
.Sp
.Vb 4
\& LINE: while (<STDIN>) {
\& last LINE if /^$/; # zakończ po skończeniu z nagłówkiem
\& ...
\& }
.Ve
.Ip "lc \s-1WYRAŻ\s0" 8
.IX Item "lc \s-1EXPR\s0"
.Ip "lc" 8
.IX Item "lc"
Zwraca \s-1WYRAŻ\s0 w małych literach. Jest to wewnętrzna funkcja,
implementująca escape \eL w łańcuchach ujętych w cudzysłowy. Jeśli włączone
jest \f(CWuse locale\fR, to szanuje bieżące locale \s-1LC_CTYPE\s0.
Zobacz stronę podręcznika \fIperllocale\fR(1).
.Sp
Jeśli \s-1WYRAŻ\s0 jest pominięte, używane jest \f(CW$_\fR.
.Ip "lcfirst \s-1WYRAŻ\s0" 8
.IX Item "lcfirst \s-1EXPR\s0"
.Ip "lcfirst" 8
.IX Item "lcfirst"
Zwraca wartość \s-1WYRAŻ\s0, w którym pierwszy znak jest zastąpiony małą
literą. Jest to funkcja wewnętrzna, implementująca escape \el w łańcuchach
ujętych w podwójne cudzysłowy. Jeśli włączone jest \f(CWuse locale\fR, to
szanuje bieżące locale \s-1LC_CTYPE\s0. Zobacz stronę podręcznika
\fIperllocale\fR(1).
.Sp
Jeśli \s-1WYRAŻ\s0 jest pominięte, używane jest \f(CW$_\fR.
.Ip "length \s-1WYRAŻ\s0" 8
.IX Item "length \s-1EXPR\s0"
.Ip "length" 8
.IX Item "length"
Zwraca długość w znakach wartości \s-1WYRAŻ\s0. Jeśli \s-1WYRAŻ\s0 jest
pominięte, zwracana jest długość \f(CW$_\fR.
.Ip "link \s-1STARYPLIK\s0,\s-1NOWYPLIK\s0" 8
.IX Item "link \s-1OLDFILE\s0,\s-1NEWFILE\s0"
Tworzy nową nazwę pliku, dowiązaną do starej nazwy pliku. Po sukcesie zwraca
1, a w przeciwnym wypadku 0.
.Ip "listen \s-1GNIAZDO\s0,\s-1ROZMIARKOLEJKI\s0" 8
.IX Item "listen \s-1SOCKET\s0,\s-1QUEUESIZE\s0"
Robi to samo, co wywołanie systemowe listen(2). Zwraca \s-1TRUE\s0 po
sukcesie, a w przeciwnym wypadku \s-1FALSE\s0. Zobacz przykład w sekcji
\fISockets: Client/Server Communication\fR w podręczniku \fIperlipc\fR(1).
.Ip "local \s-1WYRAŻ\s0" 8
.IX Item "local \s-1EXPR\s0"
Local modyfikuje wymienione zmienne tak, że są lokalne w otaczającym je
bloku, podprocedurze, \f(CWeval{}\fR, lub \f(CWdo\fR. Jeśli wymieniona jest
więcej niż jedna wartość, to lista musi być umieszczona w nawiasach. Zobacz
sekcję \fITemporary Values via local()\fR w podręczniku \fIperlsub\fR(1).
.Sp
Zamiast \fIlocal()\fR, często raczej wolałbyś użyć \fImy()\fR, gdyż to
pierwsze tak naprawdę nie jest tym czym się większości ludzi wydaje.
Odsyłam do sekcji \fIPrivate Variables via my()\fR w podręczniku
\fIperlsub\fR(1).
.Ip "localtime \s-1WYRAŻ\s0" 8
.IX Item "localtime \s-1EXPR\s0"
Konwertuje czas, zwrócony przez funkcję time na 9-elementową tablicę, której
czas jest zanalizowany dla lokalnej strefy czasowej. Zazwyczaj jest to
używane następująco:
.Sp
.Vb 3
\& # 0 1 2 3 4 5 6 7 8
\& ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
\& localtime(time);
.Ve
Wszystkie elementy tablicy są numeryczne i pochodzą wprost ze struktury tm.
W rzeczywistości znaczy to, że \f(CW$mon\fR ma zasięg 0..11, a \f(CW$wday\fR
0..6, gdzie 0 oznacza niedzielę. Poza tym, \f(CW$year\fR jest liczbą lat ot
1900 roku, tj. rok 123 oznacza 2023.
.Sp
Jeśli \s-1WYRAŻ\s0 zostanie pominięte, to używany jest czas bieżący
(\f(CWlocaltime(time)\fR).
.Sp
W kontekście skalarnym, zwraca wartość \fIctime\fR\|(3):
.Sp
.Vb 1
\& $now_string = localtime; # np., "Thu Oct 13 04:54:34 1994"
.Ve
Zobacz też moduł Time::Local i funkcje \fIstrftime\fR\|(3) i
\fImktime\fR\|(3), dostępne przez moduł \s-1POSIX\s0.
.Ip "log \s-0WYRAŻ\s0" 8
.IX Item "log \s-1EXPR\s0"
.Ip "log" 8
.IX Item "log"
Zwraca logarytm (podstawa \fIe\fR) z \s-1WYRAŻ\s0. Jeśli \s-1WYRAŻ\s0 jest
pominięte, zwraca wartość dla \f(CW$_\fR.
.Ip "lstat \s-1UCHWYTPLIKU\s0" 8
.IX Item "lstat \s-1FILEHANDLE\s0"
.Ip "lstat \s-1WYRAŻ\s0" 8
.IX Item "lstat \s-1EXPR\s0"
.Ip "lstat" 8
.IX Item "lstat"
Robi to samo, co funkcja \fIstat()\fR, lecz zamiast plików, na które
wskazują dowiązania symboliczne, testuje same dowiązania. Jeśli twój system
nie obsługuje dowiązań symbolicznych, dokonywany jest zwykły \fIstat()\fR.
.Sp
Jeśli \s-1WYRAŻ\s0 jest pominięte, używane jest \f(CW$_\fR.
.Ip "m//" 8
.IX Item "m//"
Operator porównania. Zobacz stronę \fIperlop\fR(1).
.Ip "map \s-1BLOK\s0 \s-1LISTA\s0" 8
.IX Item "map \s-1BLOCK\s0 \s-1LIST\s0"
.Ip "map \s-1WYRAŻ\s0,\s-1LISTA\s0" 8
.IX Item "map \s-1EXPR\s0,\s-1LIST\s0"
Analizuje \s-1BLOK\s0 lub \s-1WYRAŻ\s0 dla każdego elementu \s-1LISTY\s0
(ustawiając lokalnie \f(CW$_\fR na każdy element) i zwraca wartość listową,
złożoną z wyników każdego analizowania. \s-1BLOK\s0 lub \s-1WYRAŻ\s0 jest
analizowany w kontekście listowym, więc każdy element \s-1LISTY\s0 może dać
zero, jeden, lub więcej elementów w wartości zwracanej.
.Sp
.Vb 1
\& @chars = map(chr, @nums);
.Ve
tłumaczy listę liczb na odpowiadające im znaki. A
.Sp
.Vb 1
\& %hash = map { getkey($_) => $_ } @array;
.Ve
jest tylko śmiesznym sposobem zapisania
.Sp
.Vb 4
\& %hash = ();
\& foreach $_ (@array) {
\& $hash{getkey($_)} = $_;
\& }
.Ve
.Ip "mkdir \s-1NAZWAPLIKU\s0,\s-1PRAWA\s0" 8
.IX Item "mkdir \s-1FILENAME\s0,\s-1MODE\s0"
Tworzy katalog, podany jako \s-1NAZWAPLIKU\s0, którego prawa są określone
przez \s-1PRAWA\s0 (zmodyfikowane przez umaskę). Jeśli operacja zakończy się
sukcesem, zwraca 1, w przeciwnym wypadku zwraca 0 i ustawia \f(CW$!\fR
(errno).
.Ip "msgctl \s-1ID\s0,\s-1CMD\s0,\s-1ARG\s0" 8
.IX Item "msgctl \s-1ID\s0,\s-1CMD\s0,\s-1ARG\s0"
Woła funkcję IPC \fImsgctl\fR\|(2) z Systemu V. Jeśli \s-1CMd\s0 jest
&\s-1IPC_STAT\s0, to \s-1ARG\s0 musi być zmienną, która będzie przechowywać
zwróconą strukturę msquid_ds. Wartość zwracana tej funkcji jest podobna do
ioctl: dla błędu wartość niezdefiniowana, \*(L"0 but true\*(R" dla zera,
oraz rzeczywista wartość zwracana dla innych wypadków.
.Ip "msgget \s-1KLUCZ\s0,\s-1FLAGI\s0" 8
.IX Item "msgget \s-1KEY\s0,\s-1FLAGS\s0"
Woła funkcję IPC \fImsgget\fR\|(2) z Systemu V. Zwraca identyfikator kolejki
komunikatów, lub wartość niezdefiniowaną (w wypadku błędu).
.Ip "msgsnd \s-1ID\s0,\s-1MSG\s0,\s-1FLAGI\s0" 8
.IX Item "msgsnd \s-1ID\s0,\s-1MSG\s0,\s-1FLAGS\s0"
Woła funkcję IPC \fImsgsnd\fR\|(2) z Systemu V, która przesyła komunikat
\s-1MSG\s0 do kolejki komunikatów \s-1ID\s0. \s-1MSG\s0 musi zaczynać się
wartością long int, określającą typ, którą można utworzyć z pomocą
\f(CWpack("l",$typ)\fR.
Zwraca \s-1TRUE\s0 po sukcesie i \s-1FALSE\s0 w wypadku błędu.
.Ip "msgrcv \s-1ID\s0,\s-1VAR\s0,\s-1ROZMIAR\s0,\s-1TYP\s0,\s-1FLAGI\s0" 8
.IX Item "msgrcv \s-1ID\s0,\s-1VAR\s0,\s-1SIZE\s0,\s-1TYPE\s0,\s-1FLAGS\s0"
Woła funkcję IPC \fImsgrcv\fR(2) z Systemu V. Funkcja odbiera komunikat z
kolejki komunikatów \s-1ID\s0 i zapisuje go do zmiennej \s-1VAR\s0.
Maksymalna odbierana wiadomość ma wielkość \s-1ROZMIAR\s0. Zauważ, że gdy
wiadomość jest odbierana, to jej typ będzie pierwszą rzeczą, lądującą w
\s-1VAR\s0, a maksymalna długość \s-1VAR\s0 to \s-1ROZMIAR\s0 plus rozmiar
typu komunikatu. Zwraca \s-1TRUE\s0 po sukcesie, a \s-1FALSE\s0 w wypadku
błędu. [przyp.tłum.: pole TYPE generalnie w IPC oznacza typ, zdefiniowany w
pierwszych 4 bajtach komunikatu]
.Ip "my \s-1WYRAŻ\s0" 8
.IX Item "my \s-1EXPR\s0"
Instrukcja \*(L"my\*(R" deklaruje wymienione zmienne jako lokalne dla
zamkniętego bloku, podprocedury, \f(CWeval\fR lub pliku potraktowanego
instrukcjami \f(CWdo/require/use\fR.
Jeśli wymieniono więcej niż jedną wartość, lista musi być ujęta w nawiasy.
Zobacz jeszcze sekcję \fIPrivate Variables via my()\fR w podręczniku
\fIperlsub\fR(1).
.Ip "next \s-1ETYKIETA\s0" 8
.IX Item "next \s-1LABEL\s0"
.Ip "next" 8
.IX Item "next"
Komenda \f(CWnext\fR jest podobna do instrukcji \f(CWcontinue\fR w C;
rozpoczyna kolejną iterację pętli:
.Sp
.Vb 4
\& LINE: while (<STDIN>) {
\& next LINE if /^#/; # pozbądź się komentarzy
\& ...
\& }
.Ve
Zauważ, że jeśli powyżej był blok \f(CWcontinue\fR, to zostałby on wykonany
nawet na usuniętych liniach. Jeśli argument \s-1ETYKIETY\s0 jest pominięty,
komenda odnosi się do najbardziej wewnętrznej otaczającej pętli.
.Ip "no Module \s-1LISTA\s0" 8
.IX Item "no Module \s-1LIST\s0"
Zobacz funkcję \*(L"use\*(R", gdzie \*(L"no\*(R" jest przeciwieństwem.
.Ip "oct \s-1WYRAŻ\s0" 8
.IX Item "oct \s-1EXPR\s0"
.Ip "oct" 8
.IX Item "oct"
Interpretuje \s-1WYRAŻ\s0 jako łańcuch ósemkowy i zwraca odpowiadającą
wartość. (Jeśli \s-1WYRAŻ\s0 zaczyna się od 0x, jest interpretowane jako
łańcuch szesnastkowy.) Następujący kod obsługuje liczby dziesiętne, ósemkowe
i szesnastkowe w standardowej notacji perla lub C:
.Sp
.Vb 1
\& $val = oct($val) if $val =~ /^0/;
.Ve
Jeśli \s-1WYRAŻ\s0 jest pominięte, używa \f(CW$_\fR. Funkcja ta jest często
używana gdy łańcuch w rodzaju \*(L"644\*(R" musi być np. przekonwertowany na
prawa pliku. (Chociaż perl automatycznie konwertuje łańcuchy na liczby,
zgodnie z potrzebami, to automatyczna konwersja zakłada podstawę 10.)
.Ip "open \s-1UCHWYTPLIKU\s0,\s-1WYRAŻ\s0" 8
.IX Item "open \s-1FILEHANDLE\s0,\s-1EXPR\s0"
.Ip "open \s-1UCHWYTPLIKU\s0" 8
.IX Item "open \s-1FILEHANDLE\s0"
Otwiera plik, którego nazwa jest przekazywana \s-1WYRAŻ\s0, a następnie
wiąże go z \s-1UCHWYTEMPLIKU\s0. Jeśli \s-1UCHWYTPLIKU\s0 jest wyrażeniem,
to jego wartość jest używana jako nazwa rzeczywistego uchwytu pliku.
Jeśli \s-1WYRAŻ\s0 jest pominięte, to przyjmuje się, że zmienna skalarna o
tej samej nazwie co \s-1UCHWYTPLIKU\s0 zawiera nazwę pliku.
(Zauważ, że zmienne leksykalne\*(--te, deklarowane z pomocą \f(CWmy\fR--nie
będą w ten sposób działały.)
.Sp
Jeśli nazwa pliku rozpoczyna się od \*(L'<\*(R' lub od niczego, plik jest
otwierany dla wejścia (odczytu). Jeśli nazwa pliku rozpoczyna się
od \*(L'>\*(R', plik jest kasowany i otwierany dla zapisu. Jeśli nazwa pliku
rozpoczyna się od \*(L'>>\*(R', plik jest otwierany dla dopisywania.
Jeśli przed \*(L'>\*(R' lub \*(L'<\*(R' postawisz \*(L'+\*(R', oznacza to,
że chcesz zarówno czytać, jak i zapisywać do pliku. Tryb \*(L'+<\*(R'
jest zazwyczaj preferowany dla poprawek odczytu/zapisu\*(--tryb \*(L'+>\*(R'
najpierw pobiłby plik. Przedrostek i nazwa pliku mogą być
oddzielone spacjami. Wszystkie te przedrostki odpowiadają trybom otwarcia
funkcji \fIfopen\fR\|(3).
.Sp
Jeśli nazwa pliku rozpoczyna się od \*(L"|\*(R", to plik jest rozumiany jako
komenda, do której potokiem przesyłane jest wyjście. Odwrotnie, jeśli nazwa
pliku kończy się tym symbolem, to nazwa pliku jest interpretowana jako
komenda, której wyjście jest przesyłane potokiem na nasze wejście (Zobacz
sekcję \fIUsing open() for \s-1IPC\s0\fR w podręczniku \fIperlipc\fR(1)).
(Możesz nie mieć czystego \fIopen()\fR, powodującego, że komenda jest zarówno
potokiem wejściowym, jak i wyjściowym. Są jednak na to rady, zobacz stronę
podręcznika \fI\s-1IPC::\s0Open2\fR, \fI\s-1IPC::\s0Open3\fR,
oraz sekcję \fIBidirectional Communication\fR w podręczniku
\fIperlipc\fR(1).)
.Sp
Otwieranie \*(L'\-\*(R' otwiera strumień \s-1STDIN\s0, a
otwieranie \*(L'>\-\*(R' otwiera \s-1STDOUT\s0.
Open po sukcesie zwraca zero, a w przeciwnym wypadku wartość niezdefiniowaną.
Jeśli open otworzył potok, wartość zwracana jest identyfikatorem podprocesu
(pid).
.Sp
Jeśli masz na tyle pecha, że pracujesz z perlem na systemie, który odróżnia
pliki tekstowe i binarne (nowoczesne systemy ich nie rozróżniają), to
powinieneś poczytać o funkcji \f(CWbinmode\fR, opisanej gdzieś w tym
dokumencie. Systemy, wymagające binmode rozpoznaje się po ich formacie
pliku tekstowego. Systemy takie, jak Unix i Plan9, które oddzielają linie
pojedynczym znakiem i które kodują go w C jako
\&\f(CW"\en"\fR, nie potrzebują \f(CWbinmode\fR. Reszta tak.
.Sp
Przykłady:
.Sp
.Vb 3
\& $ARTICLE = 100;
\& open ARTICLE or die "Nie mogę znaleźć artykułu $ARTICLE: $!\en";
\& while (<ARTICLE>) {...
.Ve
.Vb 1
\& open(LOG, '>>/usr/spool/news/twitlog'); # (log jest zarezerwowany)
.Ve
.Vb 1
\& open(DBASE, '+<dbase.mine'); # otwórz dla odnowienia
.Ve
.Vb 1
\& open(ARTICLE, "caesar <$article |"); # dekoduj artykuł
.Ve
.Vb 1
\& open(EXTRACT, "|sort >/tmp/Tmp$$"); # $$ jest pidem naszego procesu
.Ve
.Vb 1
\& # przetwórz listę argumentów plików, wraz z wszelkimi załącznikami
.Ve
.Vb 3
\& foreach $file (@ARGV) {
\& process($file, 'fh00');
\& }
.Ve
.Vb 7
\& sub process {
\& local($filename, $input) = @_;
\& $input++; # jest to inkrementacja łańcuchowa
\& unless (open($input, $filename)) {
\& print STDERR "Nie mogę otworzyć $filename: $!\en";
\& return;
\& }
.Ve
.Vb 8
\& while (<$input>) { # note use of indirection
\& if (/^#include "(.*)"/) {
\& process($1, $input);
\& next;
\& }
\& ... # cokolwiek
\& }
\& }
.Ve
Możesz również, zgodnie z tradycją powłoki Bourne, podać \s-1WYRAŻ\s0,
zaczynający się od \*(L">&\*(R", co oznacza, że reszta łańcucha jest
interpretowana jako nazwa uchwytu pliku (lub numerycznego deskryptora
pliku), który należy zduplikować i otworzyć. & można użyć po >, >>, <, +>,
+>>, i +<. Tryb, który podasz, powinien odpowiadać trybowi oryginalnego
uchwytu pliku. (Duplikowanie uchwytów pliku nie pobiera na konto żadnych
istniejących zawartości buforów stdio.)
Oto skrypt, który zachowuje, przekierowuje i odświeża \s-1STDOUT\s0 i
\s-1STDERR\s0:
.Sp
.Vb 3
\& #!/usr/bin/perl
\& open(SAVEOUT, ">&STDOUT");
\& open(SAVEERR, ">&STDERR");
.Ve
.Vb 2
\& open(STDOUT, ">foo.out") || die "Nie mogę przekierować stdout";
\& open(STDERR, ">&STDOUT") || die "Nie mogę zduplikować stdout";
.Ve
.Vb 2
\& select(STDERR); $| = 1; # zrób niebuforowane
\& select(STDOUT); $| = 1; # j/w
.Ve
.Vb 2
\& print STDOUT "stdout 1\en"; # działa to też dla
\& print STDERR "stderr 1\en"; # podprocesów
.Ve
.Vb 2
\& close(STDOUT);
\& close(STDERR);
.Ve
.Vb 2
\& open(STDOUT, ">&SAVEOUT");
\& open(STDERR, ">&SAVEERR");
.Ve
.Vb 2
\& print STDOUT "stdout 2\en";
\& print STDERR "stderr 2\en";
.Ve
Możesz podać \*(L"<&=N\*(R", gdzie N jest liczbą. Perl wtedy dokona operacji
równoważnej \fIfdopen(3)\fR z C. Na przykład:
.Sp
.Vb 1
\& open(FILEHANDLE, "<&=$fd")
.Ve
Jeśli otwierasz potok do komendy \*(L"\-\*(R", np. albo \*(L"|\-\*(R"
albo \*(L"\-|\*(R", to dokonywany jest niejawny fork, a zwrócona wartość
open jest wewnątrz procesu rodzicielskiego pidem potomka, a w wątku potomka
zerem. (Aby określić, czy open był pomyślny, użyj \f(CWdefined($pid)\fR.)
Uchwyt pliku u rodzica zachowuje się normalnie, lecz i/o dla tego uchwytu
jest przesyłane przez potok \s-1STDOUT/STDIN\s0 procesu potomnego.
W procesie potomny uchwyt nie jest otwierany\*(--i/o jest z/do nowego
\s-1STDOUT\s0 lub \s-1STDIN\s0. Zazwyczaj jest to używane jak normalny
potokowy open, lecz daje lepszą kontrolę nad wywoływaniem komendy potoku,
np. gdy pracujesz w suid i nie chcesz być zmuszonym do skanowania komend
powłoki w poszukiwaniu metaznaków.
Następujące pary są mniej lub bardziej równoważne:
.Sp
.Vb 2
\& open(FOO, "|tr '[a-z]' '[A-Z]'");
\& open(FOO, "|-") || exec 'tr', '[a-z]', '[A-Z]';
.Ve
.Vb 2
\& open(FOO, "cat \-n '$file'|");
\& open(FOO, "\-|") || exec 'cat', '\-n', $file;
.Ve
Dla szczegółów, zobacz sekcję \fISafe Pipe Opens\fR w podręczniku
\fIperlipc\fR(1).
.Sp
\s-1UWAGA\s0: Przy każdej operacji, dokonującej forkowania, nieopróżnione
bufory pozostają takie w obydwu procesach, co znaczy, że lepiej ustawić
\f(CW$|\fR, aby zapobiec duplikowaniu wyjścia.
.Sp
Zamykanie potokowego uchwytu pliku powoduje, że proces rodzicielski czeka,
aż dziecko zakończy i zwraca wartość statusu w \f(CW$?\fR.
.Sp
Jeśli używasz konstruktora z pakietu \s-1IO::\s0Handle (lub z jego podklas,
takich jak \s-1IO::\s0File czy \s-1IO::\s0Socket), możesz generować
anonimowe uchwyty plików, które mają zakres dowolnych zmiennych, które
utrzymują do nich referencje. Zamykają się one automatycznie po wyjściu z
zakresu:
.Sp
.Vb 12
\& use IO::File;
\& ...
\& sub read_myfile_munged {
\& my $ALL = shift;
\& my $handle = new IO::File;
\& open($handle, "myfile") or die "myfile: $!";
\& $first = <$handle>
\& or return (); # Automatyczne zamknięcie tutaj.
\& mung $first or die "mung failed"; # Lub tutaj.
\& return $first, <$handle> if $ALL; # Lub tutaj.
\& $first; # Lub tutaj.
\& }
.Ve
Nazwa pliku, która jest przekazana open, przechodzi operację usuwania
prowadzących i kończących białych spacji. Aby otworzyć plik, posiadający te
dziwne znaki, trzeba je chronić:
.Sp
.Vb 2
\& $file =~ s#^(\es)#./$1#;
\& open(FOO, "< $file\e0");
.Ve
Jeśli chcesz użyć prawdziwego, znanego z C \fIopen()\fR (zobacz stronę
\fIopen(2)\fR), to powinieneś użyć funkcji \fIsysopen()\fR. Jest to inny
sposób chronienia nazw plików przed interpretacją. Np:
.Sp
.Vb 7
\& use IO::Handle;
\& sysopen(HANDLE, $path, O_RDWR|O_CREAT|O_EXCL, 0700)
\& or die "sysopen $path: $!";
\& HANDLE->autoflush(1);
\& HANDLE->print("stuff $$\en");
\& seek(HANDLE, 0, 0);
\& print "Plik zawiera: ", <HANDLE>;
.Ve
Dla dalszych detali o miksowaniu odczytywania i zapisywania, obejrzyj opis
\f(CWseek()\fR, znajdujący się gdzie indziej w tym dokumencie.
.Ip "opendir \s-1UCHWYTKATALOGU\s0,\s-1WYRAŻ\s0" 8
.IX Item "opendir \s-1DIRHANDLE\s0,\s-1EXPR\s0"
Otwiera katalog o nazwie \s-1WYRAŻ\s0. Otwarty uchwyt można przetwarzać
funkcjami \fIreaddir()\fR, \fItelldir()\fR,
\fIseekdir()\fR, \fIrewinddir()\fR, i \fIclosedir()\fR.
Po sukcesie zwraca \s-1TRUE\s0. Uchwyty katalogów mają swoją własną
przestrzeń nazw. Jest ona oddzielna od uchwytów plików.
.Ip "ord \s-1WYRAŻ\s0" 8
.IX Item "ord \s-1EXPR\s0"
.Ip "ord" 8
.IX Item "ord"
Zwraca numeryczną wartość ascii pierwszego znaku \s-1WYRAŻ\s0. Jeśli
\s-1WYRAŻ\s0 zostało pominięte, używane jest \f(CW$_\fR. Dla operacji
odwrotnej, zobacz opis \f(CWchr\fR, znajdujący się gdzieś w tym dokumencie.
.Ip "pack \s-1WZORZEC\s0,\s-1LISTA\s0" 8
.IX Item "pack \s-1TEMPLATE\s0,\s-1LIST\s0"
Pobiera tablicę lub listę wartości i pakuje ją w strukturę binarną,
zwracając łańcuch, zawierający tę strukturę. \s-1WZORZEC\s0 jest sekwencją
znaków, które pokazują kolejność i typy wartości. Są one następujące:
.Sp
.Vb 6
\& A Łańcuch ascii, dopełniany spacjami.
\& a Łańcuch ascii, dopełniany przez null.
\& b Łańcuch bitowy (wznosząca kolejność bitów, jak w vec()).
\& B Łańcuch bitowy (malejąca kolejność bitów).
\& h Łańcuch szesnastkowy (najpierw niski nibble).
\& H Łańcuch szesnastkowy (najpierw wysoki nibble).
.Ve
.Vb 2
\& c Wartość char ze znakiem.
\& C Wartość char bez znaku.
.Ve
.Vb 4
\& s Wartość short.
\& S Wartość short bez znaku.
\& (Ten 'short' jest _dokładnie_ 16 bitowy, co może się różnić od
\& tego, co lokalny kompilator C nazywa jako 'short'.)
.Ve
.Vb 5
\& i Wartość int ze znakiem.
\& I Wartość int bez znaku.
\& (Ten 'int' jest przynajmniej 32 bitowy. Dokładny rozmiar zależy
\& od tego, co lokalny kompilator C uważa za 'int' i może być nawet
\& większe niż 'long', opisywany dalej.)
.Ve
.Vb 4
\& l Wartość long ze znakiem.
\& L Wartość long bez znaku.
\& (Ta wartość 'long' jest _dokładnie_ 32 bitowa, co może się
\& różnić od tego, co lokalny kompilator C uważa za 'long'.)
.Ve
.Vb 6
\& n Short w porządku sieciowym (big-endian).
\& N Long w porządku sieciowym (big-endian).
\& v Short w porządku "VAX" (little-endian).
\& V Long w porządku "VAX" (little-endian).
\& (Te 'short' i 'long' są _dokładnie_ 16 i
\& 32 bitowe (odpowiednio).)
.Ve
.Vb 2
\& f Float pojedynczej precyzji w formacie macierzystym.
\& d Float podwójnej precyzji w formacie macierzystym.
.Ve
.Vb 2
\& p Wskaźnik do łańcucha zakończonego zerem.
\& P Wskaźnik do struktury (łańcuch o ustalonej długości).
.Ve
.Vb 1
\& u Uuencodowany łańcuch.
.Ve
.Vb 4
\& w Skompresowany integer BER. Jego bajty reprezentują całkowity
\& integer o podstawie 128, najpierw bardziej znaczące cyfry,
\& z tak małą ilością cyfr, jak tylko się da. Ósmy bit jest ustawiany
\& na każdym bajcie, poza ostatnim.
.Ve
.Vb 3
\& x Bajt null.
\& X Wstecz o bajt (?) (Back up a byte).
\& @ Wypełnienie null do bezwzględnej pozycji (?)
\& (Null fill to absolute position).
.Ve
Po każdej literze może opcjonalnie następować liczba, która podaje licznik
powtórzeń. Dla wszystkich typów, poza \*(L"a\*(R", \*(L"A\*(R", \*(L"b\*(R", \*(L"B\*(R", \*(L"h\*(R", \*(L"H\*(R",
i \*(L"P\*(R", funkcja pack pożre tyle samo wartości z \s-1LISTY\s0.
Gwiazdka (*) dla licznika powtórzeń, oznacza użycie wszystkich elementów,
które pozostały. Typy \*(L"a\*(R" i \*(L"A\*(R" pobierają tylko jedną
wartość, lecz pakują ją jako łańcuch o podanej długości, wypełniając ją
w razie potrzeby zerami, lub spacjami. (Podczas rozpakowywania, \*(L"A\*(R"
zdejmuje kończące spacje i zera, lecz \*(L"a\*(R" tego nie robi.)
Podobnie, pola \*(L"b\*(R" i \*(L"B\*(R" pakują łańcuchy, które są długości
tylu bitów. \*(L"h\*(R" i \*(L"H\*(R" pakują łańcuchy, które są długości tylu
nibblów. \*(L"P\*(R" pakuje wskaźnik do struktury, której rozmiar jest
wskazywany przez długość. Liczby rzeczywiste (float, double) są tylko w
formacie macierzystym maszyny; z powodu wielości formatów zmiennoprzecinkowych i
braku standardowej reprezentacji \*(L"sieciowej\*(R", nie ma żadnego sposobu
uniwersalnej wymiany. Oznacza to, że spakowane dane zmiennoprzecinkowe,
zapisane na jednej maszynie, mogą nie być odczytywalne na innej \- nawet
jeśli obydwie używają arytmetyki zmiennoprzecinkowej \s-1IEEE\s0 (gdyż
endainowość pamięci nie jest częścią specyfikacji \s-1IEEE\s0). Zauważ, że
perl używa wewnętrznie dla wszystkich obliczeń numerycznych reprezentacji
double i że konwersja z double na float, a potem z powrotem na double
powoduje utratę precyzji (np. \f(CWunpack("f", pack("f", $foo)\fR)
nie będzie w ogólnym przypadku się równać \f(CW$foo\fR).
.Sp
Przykłady:
.Sp
.Vb 4
\& $foo = pack("cccc",65,66,67,68);
\& # foo to "ABCD"
\& $foo = pack("c4",65,66,67,68);
\& # to samo
.Ve
.Vb 2
\& $foo = pack("ccxxcc",65,66,67,68);
\& # foo to "AB\e0\e0CD"
.Ve
.Vb 3
\& $foo = pack("s2",1,2);
\& # "\e1\e0\e2\e0" na little-endian
\& # "\e0\e1\e0\e2" na big-endian
.Ve
.Vb 2
\& $foo = pack("a4","abcd","x","y","z");
\& # "abcd"
.Ve
.Vb 2
\& $foo = pack("aaaa","abcd","x","y","z");
\& # "axyz"
.Ve
.Vb 2
\& $foo = pack("a14","abcdefg");
\& # "abcdefg\e0\e0\e0\e0\e0\e0\e0"
.Ve
.Vb 2
\& $foo = pack("i9pl", gmtime);
\& # rzeczywista struktura tm (przynajmniej na moim systemie)
.Ve
.Vb 3
\& sub bintodec {
\& unpack("N", pack("B32", substr("0" x 32 . shift, \-32)));
\& }
.Ve
Ten sam wzorzec może być ogólnie używany też w funkcji unpack.
.Ip "package \s-1PRZESTRZEŃNAZW\s0" 8
.IX Item "package \s-1NAMESPACE\s0"
Deklaruje jednostkę kompilacji, przynależącą do danej przestrzeni nazw.
Zakres deklaracji pakietu leży od deklaracji, do końca otaczającego bloku
(tak samo, jak zakres operatora \fIlocal()\fR). Wszelkie dalsze
niekwalifikowane identyfikatory dynamiczne będą wewnątrz tej przestrzeni
nazw. Instrukcja package dotyczy tylko zmiennych dynamicznych\*(--włączając
w to te, których użyłeś lokalnie (\fIlocal()\fR),\*(--lecz \fInie\fR zmienne
leksykalne, utworzone przez \fImy()\fR. Zazwyczaj jest to pierwsza
deklaracja we włączanym przez \f(CWrequire\fR lub \fIuse\fR pliku.
Możesz przełączyć się do pakietu w więcej niż jednym miejscu; ma to wpływ
jedynie na to, której tablicy symboli używa kompilator dla reszty bloku.
Do zmiennych i uchwytów plików z innych pakietów, możesz odnosić się,
poprzedzając identyfikatory nazwami pakietów, za którymi następują dwa
dwukropki: \f(CW$Pakiet::Zmienna\fR. Jeśli nazwa pakietu jest zerowa,
używany jest pakiet \f(CWmain\fR. Tak więc \f(CW$::sail\fR jest równoważne \f(CW$main::sail\fR.
.Sp
Zobacz sekcję \fIPackages\fR w podręczniku \fIperlmod\fR(1).
Zobacz też podręcznik \fIperlsub\fR(1), gdzie opisane są problemy zakresów.
.Ip "pipe \s-1UCHWYTODCZYTU\s0,\s-1UCHWYTZAPISU\s0" 8
.IX Item "pipe \s-1READHANDLE\s0,\s-1WRITEHANDLE\s0"
Otwiera parę połączonych potoków, zupełnie jak wywołanie systemowe
\fIpipe\fR(2). Zauważ, że jeśli zestawiasz pętle potokowych procesów, to o
ile nie zachowasz ostrożności, może pojawić się deadlock. Dodatkowo, zauważ,
że potoki perla używają buforowania stdio, więc możesz być zmuszonym ustawić
\f(CW$|\fR, aby opróżnić swój \s-1UCHWYTZAPISU\s0 po każdej z komend,
zależnie od aplikacji.
.Sp
Obejrzyj jeszcze stronę \fI\s-1IPC::\s0Open2\fR, \fI\s-1IPC::\s0Open3\fR
oraz sekcję \fIBidirectional Communication\fR z podręcznika
\fIperlipc\fR(1). Są tam przykłady takich rzeczy.
.Ip "pop \s-1TABLICA\s0" 8
.IX Item "pop \s-1ARRAY\s0"
.Ip "pop" 8
.IX Item "pop"
Pobiera i zwraca ostatnią wartość tablicy, skracając ją o jeden. Ma podobne
działanie do
.Sp
.Vb 1
\& $tmp = $ARRAY[$#ARRAY--];
.Ve
Jeśli tablica nie ma elementów, zwracana jest wartość niezdefiniowana.
Jeśli parametr \s-1TABLICA\s0 zostanie pominięty, to pobiera z tablicy
\f(CW@ARGV\fR w programie głównym, oraz z \f(CW@_\fR w podprocedurach,
podobnie jak \fIshift()\fR.
.Ip "pos \s-1SKALAR\s0" 8
.IX Item "pos \s-1SCALAR\s0"
.Ip "pos" 8
.IX Item "pos"
Zwraca offset, gdzie dla zmiennej \s-1SKALAR\s0 zakończyło się ostatnie
przeszukiwanie \f(CWm//g\fR. (Jeśli nie podano zmiennej, używany jest $_).
Można go modyfikować w celu zmieniania offsetu. Modyfikacja ta wpłynie
również na zapewnienia zerowej szerokości \f(CW\eG\fR w wyrażeniach
regularnych. Zobacz podręczniki \fIperlref\fR(1) i \fIperlop\fR(1).
.Ip "print \s-1UCHWYTPLIKU\s0 \s-1LISTA\s0" 8
.IX Item "print \s-1FILEHANDLE\s0 \s-1LIST\s0"
.Ip "print \s-1LISTA\s0" 8
.IX Item "print \s-1LIST\s0"
.Ip "print" 8
.IX Item "print"
Drukuje oddzieloną przecinkami listę łańcuchów. Po sukcesie zwraca
\s-1TRUE\s0. \s-1UCHWYTPLIKU\s0 może być nazwą zmiennej skalarnej, w którym
wypadku zmienna ta przechowuje nazwę lub referencję do uchwytu pliku,
wprowadzając tak poziom niebezpośredniości.
(\s-1UWAGA\s0: Jeśli \s-1UCHYTPLIKU\s0 jest zmienną, a następny token jest
[term], to może to być źle zinterpretowane jako operator, chyba że wstawisz +,
lub ujmiesz argumenty w nawiasy.) Jeśli \s-1UCHWYTPLIKU\s0 jest pominięty,
drukowanie następuje na standardowe wyjście (lub do ostatnio wybranego
kanału wyjściowego\*(--zobacz opis \f(CWselect\fR, znajdujący się gdzieś w tym dokumencie ).
Jeśli pominięto również argument \s-1LISTY\s0, na STDOUT drukowane jest $_.
Aby ustawić kanał wyjściowy na coś innego niż
\s-1STDOUT\s0, użyj operacji select. Zauważ, że z uwagi na to, że print
pobiera \s-1LISTĘ\s0, wszystko z \s-1LISTY\s0 jest analizowane w kontekście
listowym, a wszelka podprocedura, którą wywołasz, będzie miała jedno, lub
więcej wyrażeń analizowanych w kontekście listowym. Uważaj też, by nie
wpisywać z słowem kluczowym print lewego nawiasu, chyba że chcesz by
odpowiadający prawy nawias kończył argumenty do drukowania\*(--wstaw +, lub
otocz wszystkie argumenty nawiasami.
.Sp
Zauważ, że jeśli przechowujesz \s-1UCHWYTYPLIKÓW\s0 w tablicy, lub innym
wyrażeniu, będziesz musiał używać bloku, zwracającego jego wartość:
.Sp
.Vb 2
\& print { $files[$i] } "stuff\en";
\& print { $OK ? STDOUT : STDERR } "stuff\en";
.Ve
.Ip "printf \s-1UCHWYTPLIKU\s0 \s-1FORMAT\s0, \s-1LISTA\s0" 8
.IX Item "printf \s-1FILEHANDLE\s0 \s-1FORMAT\s0, \s-1LIST\s0"
.Ip "printf \s-1FORMAT\s0, \s-1LISTA\s0" 8
.IX Item "printf \s-1FORMAT\s0, \s-1LIST\s0"
Równoważne \f(CWprint UCHWYTPLIKU sprintf(FORMAT, LISTA)\fR.
Pierwszy argument list będzie interpretowany jako format printf.
Jeśli włączone jest \f(CWuse locale\fR, to znak używany dla kropki
dziesiętnej jest zależny od locala \s-1LC_NUMERIC\s0. Zobacz stronę
podręcznika \fIperllocale\fR(1).
.Sp
Nie wpadnij w pułapkę używania \fIprintf()\fR, gdy wystarczyłby zwykły
\fIprint()\fR. Funkcja \fIprint()\fR jest efektywniejsza i mniej wrażliwa na
błędy.
.Ip "prototype \s-1FUNKCJA\s0" 8
.IX Item "prototype \s-1FUNCTION\s0"
Zwraca w postaci łańcucha prototyp funkcji (lub \f(CWundef\fR, jeśli funkcja
nie ma prototypu). \s-1FUNKCJA\s0 jest referencją lub nazwą funkcji, której
prototyp usiłujemy uzyskać.
.Ip "push \s-1TABLICA\s0,\s-1LISTA\s0" 8
.IX Item "push \s-1ARRAY\s0,\s-1LIST\s0"
Traktuje \s-1TABLICĘ\s0 jako stos i wrzuca na jej szczyt wartości \s-1LISTY\s0.
Długość \s-1TABLICY\s0 zwiększa się o długość \s-1LISTY\s0. Ma takie samo
działanie jak
.Sp
.Vb 3
\& for $value (LIST) {
\& $ARRAY[++$#ARRAY] = $value;
\& }
.Ve
lecz jest efektywniejsze. Zwraca nową liczbę elementów tablicy.
.Ip "q/\s-1ŁAŃCUCH\s0/" 8
.IX Item "q/\s-1ŁAŃCUCH\s0/"
.Ip "qq/\s-1ŁAŃCUCH\s0/" 8
.IX Item "qq/\s-1ŁAŃCUCH\s0/"
.Ip "qx/\s-1ŁAŃCUCH\s0/" 8
.IX Item "qx/\s-1ŁAŃCUCH\s0/"
.Ip "qw/\s-1ŁAŃCUCH\s0/" 8
.IX Item "qw/\s-1ŁAŃCUCH\s0/"
Uogólnione cudzysłowy. Zobacz stronę \fIperlop\fR(1).
.Ip "quotemeta \s-1WYRAŻ\s0" 8
.IX Item "quotemeta \s-1EXPR\s0"
.Ip "quotemeta" 8
.IX Item "quotemeta"
Zwraca wartość \s-1WYRAŻ\s0 z poprzedzonymi odwróconymi ukośnikami wszystkimi
nie-alfanumerycznymi znakami. (To znaczy, że wszystkie znaki, nie podpadające
pod \f(CW/[A-Za-z_0-9]/\fR zostaną poprzedzone odwrotnym ukośnikiem,
niezależnie od ustawień locale.)
Jest to wewnętrzna funkcja, implementująca escape Q w łańcuchach z
podwójnych cudzysłowów.
.Sp
Jeśli \s-1WYRAŻ\s0 jest pominięte, używane jest \f(CW$_\fR.
.Ip "rand \s-1WYRAŻ\s0" 8
.IX Item "rand \s-1EXPR\s0"
.Ip "rand" 8
.IX Item "rand"
Zwraca losową liczbę, większą lub równą 0 i mniejszą od wartości
\s-1WYRAŻ\s0. (\s-1WYRAŻ\s0 powinno być dodatnie.) Jeśli \s-1WYRAŻ\s0 jest
pominięte, używana jest wartość 1. Automatycznie wywołuje \fIsrand()\fR,
chyba że był on już wywołany. Zobacz też opis \fIsrand()\fR.
.Sp
(Uwaga: Jeśli twoja funkcja rand zwraca stale liczby, które są zbyt wielkie,
lub zbyt małe, to znaczy, że twoja wersja perla prawdopodobnie została
skompilowana ze złą liczbą \s-1RANDBITS\s0.)
.Ip "read \s-1UCHWYTPLIKU\s0,\s-1SKALAR\s0,\s-1DŁUGOŚĆ\s0,\s-1OFFSET\s0" 8
.IX Item "read \s-1UCHWYTPLIKU\s0,\s-1SKALAR\s0,\s-1DŁUGOŚĆ\s0,\s-1OFFSET\s0"
.Ip "read \s-1UCHWYTPLIKU\s0,\s-1SKALAR\s0,\s-1DŁUGOŚĆ\s0" 8
.IX Item "read \s-1FILEHANDLE\s0,\s-1SCALAR\s0,\s-1LENGTH\s0"
Próbuje odczytać \s-1DŁUGOŚĆ\s0 bajtów danych do zmiennej \s-1SKALAR\s0 z
pliku wskazywanego przez \s-1UCHWYTPLIKU\s0. Zwraca liczbę odczytanych
bajtów, lub undef w wypadku błędu. \s-1SKALAR\s0 zostanie rozciągnięty, lub
skurczony do rzeczywistej długości odczytanych danych. Można też podać
\s-1OFFSET\s0. Wtedy odczyt nastąpi w innym miejscu niż początek łańcucha.
Wywołanie to jest w rzeczywistości zaimplementowane w oparciu o wywołanie
fread(3) stdio. Aby uzyskać prawdziwe wywołanie systemowe read(2), użyj
\fIsysread()\fR.
.Ip "readdir \s-1UCHWYTKATALOGU\s0" 8
.IX Item "readdir \s-1DIRHANDLE\s0"
Zwraca następny wpis katalogu, otwartego przez \fIopendir()\fR. Jeśli jest
używane w kontekście listowym, zwraca resztę wpisów w katalogu. Jeśli nie ma
już więcej wpisów, w kontekście skalarnym zwracana jest wartość
niezdefiniowana, a w kontekście listowym listę null.
.Sp
Jeśli masz zamiar dokonywać testów plikowych na wartościach zwracanych przez
\fIreaddir()\fR, to lepiej poprzedź te nazwy katalogiem. Powinno się tak
robić, gdyż nie \fIreaddir()\fR nie przechodzi do swojego katalogu i
zaszło by testowanie nie tego pliku co trzeba.
.Sp
.Vb 3
\& opendir(DIR, $some_dir) || die "Nie powiódł się opendir $some_dir: $!";
\& @dots = grep { /^\e./ && \-f "$some_dir/$_" } readdir(DIR);
\& closedir DIR;
.Ve
.Ip "readlink \s-1WYRAŻ\s0" 8
.IX Item "readlink \s-1EXPR\s0"
.Ip "readlink" 8
.IX Item "readlink"
Zwraca wartość dowiązania symbolicznego. Działa to, jeśli dowiązania
symboliczne są zaimplementowane [w systemie]. W przeciwnym wypadku powstaje
błąd krytycznych. W wypadku błędu systemowego, zwracana jest wartość
niezdefiniowana i ustawiane jest \f(CW$!\fR (errno). Jeśli \s-1WYRAŻ\s0
zostanie pominięte, używane jest \f(CW$_\fR.
.Ip "recv \s-1GNIAZDO\s0,\s-1SKALAR\s0,\s-1DŁUGOŚĆ\s0,\s-1FLAGI\s0" 8
.IX Item "recv \s-1SOCKET\s0,\s-1SCALAR\s0,\s-1LEN\s0,\s-1FLAGS\s0"
Odbiera komunikat na gnieździe. Próbuje odebrać \s-1DŁUGOŚĆ\s0 bajtów do
zmiennej \s-1SKALAR\s0. (\s-1GNIAZDO\s0 to uchwyt gniazda).
W rzeczywistości funkcja wykonuje odpowiednik funkcji C \fIrecvfrom()\fR(2),
więc zwraca adres nadawcy. W wypadku błędu, zwracana jest wartość
niezdefiniowana. \s-1SKALAR\s0 będzie rozciągany do długości rzeczywiście
odczytanych danych. Flagi są takie same jak w wywołaniu systemowym o tej
samej nazwie.
Zobacz jeszcze sekcję \fI\s-1UDP\s0: Message Passing\fR w podręczniku
\fIperlipc\fR(1). Są tam przykłady.
.Ip "redo \s-1ETYKIETA\s0" 8
.IX Item "redo \s-1LABEL\s0"
.Ip "redo" 8
.IX Item "redo"
Komenda \f(CWredo\fR restartuje blok pętli, nie analizując przy tym warunku.
Blok \f(CWcontinue\fR (jeśli taki istnieje) również nie jest wykonywany.
Jeśli pominięta zostanie \s-1ETYKIETA\s0, komenda odnosi się do najbardziej
wewnętrznej otaczającej pętli. Komenda ta jest zazwyczaj wykorzystywana
przez programy, które chcą się oszukiwać co do tego, co było właśnie
pobrane:
.Sp
.Vb 16
\& # Uproszczony ogołacacz komentarzy Pascala
\& # (uwaga: zakłada brak { i } w łańcuchach)
\& LINE: while (<STDIN>) {
\& while (s|({.*}.*){.*}|$1 |) {}
\& s|{.*}| |;
\& if (s|{.*| |) {
\& $front = $_;
\& while (<STDIN>) {
\& if (/}/) { # Koniec komentarza?
\& s|^|$front{|;
\& redo LINE;
\& }
\& }
\& }
\& print;
\& }
.Ve
.Ip "ref \s-1WYRAŻ\s0" 8
.IX Item "ref \s-1EXPR\s0"
.Ip "ref" 8
.IX Item "ref"
Jeśli wartość \s-1WYRAŻ\s0 jest referencją, zwracane jest \s-1TRUE\s0, a w
przeciwnym wypadku \s-1FALSE\s0. Jeśli \s-1WYRAŻ\s0 zostanie pominięte,
użyte zostanie \f(CW$_\fR. Zwracana wartość zależy od typu, do którego
referencja jest referencją.
Wbudowane typy to:
.Sp
.Vb 6
\& REF
\& SCALAR
\& ARRAY
\& HASH
\& CODE
\& GLOB
.Ve
Jeśli referencjowany obiekt został błogosławiony (\fIbless()\fR) do pakietu,
to zwracana jest nazwa pakietu. Możesz myśleć o \fIref()\fR jak o operatorze
\fItypeof()\fR.
.Sp
.Vb 6
\& if (ref($r) eq "HASH") {
\& print "r jest referencją do tablicy asocjacyjnej.\en";
\& }
\& if (!ref ($r) {
\& print "r nie jest referencją.\en";
\& }
.Ve
Zobacz też stronę podręcznika \fIperlref\fR(1).
.Ip "rename \s-1STARANAZWA\s0,\s-1NOWANAZWA\s0" 8
.IX Item "rename \s-1OLDNAME\s0,\s-1NEWNAME\s0"
Zmienia nazwę pliku. Po sukcesie zwraca 1, w przeciwnym wypadku 0. Nie
działa między granicami systemów plików.
.Ip "require \s-1WYRAŻ\s0" 8
.IX Item "require \s-1EXPR\s0"
.Ip "require" 8
.IX Item "require"
Zażądaj pewnej właściwości, podanej przez \s-1WYRAŻ\s0, lub \f(CW$_\fR, jeśli
go nie podano. Jeśli \s-1WYRAŻ\s0 jest numeryczne, to wymaga ono by bieżąca
wersja perla (\f(CW$]\fR lub \f(CW$PERL_VERSION\fR) była większa lub równa
\s-1WYRAŻ\s0.
.Sp
W przeciwnym wypadku żąda włączenia pliku biblioteki (o ile nie jest on już
włączony). Plik jest włączany z użyciem mechanizmu do-\s-1PLIK\s0, który w
zasadzie jest wariacją \fIeval()\fR. Semantyka jest podobna do następującej
podprocedury:
.Sp
.Vb 19
\& sub require {
\& local($filename) = @_;
\& return 1 if $INC{$filename};
\& local($realfilename,$result);
\& ITER: {
\& foreach $prefix (@INC) {
\& $realfilename = "$prefix/$filename";
\& if (\-f $realfilename) {
\& $result = do $realfilename;
\& last ITER;
\& }
\& }
\& die "Nie mogę znaleźć $filename w \e@INC";
\& }
\& die $@ if $@;
\& die "$filename nie zwróciło prawdziwej wartości" unless $result;
\& $INC{$filename} = $realfilename;
\& $result;
\& }
.Ve
Zauważ, że plik nie będzie włączany pod tą samą nazwą dwukrotnie. Jako
ostatnią instrukcję, plik musi zwracać \s-1TRUE\s0, wskazując tak pomyślne
wykonanie kodu inicjalizacji, więc zazwyczaj kończy się takie pliki \*(L"1;\*(R",
chyba że jesteś pewien, że zwróci \s-1TRUE\s0 tak czy inaczej. Lepiej
jednak wstawić po prostu\*(L"\f(CW1;\fR\*(R", na wypadek np. dodania nowych
instrukcji.
.Sp
Jeśli \s-1WYRAŻ\s0 jest prostym słowem, require zakłada rozszerzenie \*(L"\fI.pm\fR\*(R"
i samodzielnie zamienia \*(L"\fI::\fR\*(R" na \*(L"\fI/\fR\*(R",
ułatwiając ładowanie modułów standardowych. Ta postać ładowania modułów nie
ryzykuje zmieniania twojej przestrzeni nazw.
to make it easy to load standard modules. This form of loading of
modules does not risk altering your namespace.
.Sp
Dla potężniejszego narzędzia importu, obejrzyj opis \f(CWuse\fR, znajdujący
się w tym dokumencie, oraz stronę \fIperlmod\fR(1).
.Ip "reset \s-1WYRAŻ\s0" 8
.IX Item "reset \s-1EXPR\s0"
.Ip "reset" 8
.IX Item "reset"
Ogólnie, używane w bloku \f(CWcontinue\fR na końcu pętli, w celu
wyczyszczenia zmiennych i resetowania przeszukiwań ??, tak by znów działały.
Wyrażenie jest interpretowane jako lista pojedynczych znaków (dla podawania
zakresów, można używać myślników). Wszystkie zmienne i tablice,
rozpoczynające się na jedną z tych liter, są resetowane do stanu
pierwotnego. Jeśli wyrażenie zostanie pominięte, przeszukiwania
jednego-trafienia (?wzorzec?) są resetowane do ponownego trafienia.
Resetowanie tyczy się tylko obiektów bieżącego pakietu. Zwracane jest zawsze 1.
Przykłady:
.Sp
.Vb 3
\& reset 'X'; # resetuj wszystkie zmienne X
\& reset 'a-z'; # resetuj zmienne małoliterowe
\& reset; # resetuj tylko przeszukiwania ??
.Ve
Resetowanie \*(L"A\-Z\*(R" nie jest zalecane, gdyż odniesie się ono również
do tablic \s-1ARGV\s0 i \s-1ENV\s0. Resetowane są tylko zmienne
pakietu\*(--zmienne leksykalne są nietykane, lecz one i tak oczyszczają się
na wyjściu z zakresu. Zobacz opis \f(CWmy\fR, znajdujący się gdzieś w tym
dokumencie.
.Ip "return \s-1WYRAŻ\s0" 8
.IX Item "return \s-1EXPR\s0"
.Ip "return" 8
.IX Item "return"
Powraca z podprocedury, \fIeval()\fR, lub z do \s-1PLIK\s0, z wartością
podaną przez \s-1WYRAŻ\s0. Analiza \s-1WYRAŻ\s0 może zachodzić w kontekście
listowym, skalarnym, lub pustym (void). Zależy to od sposobu użycia wartości
zwracanej, a kontekst może się zmieniać od jednego wywołania do drugiego
(zobacz \fIwantarray()\fR). Jeśli \s-1WYRAŻ\s0 nie jest podane, w kontekście
skalarnym zwracana jest wartość niezdefiniowana, w listowym pusta lista, a w
pustym (void) nic.
.Sp
(Zauważ, że przy braku return, podprocedura, eval, lub do \s-1PLIK\s0
zakończą automatycznie z wartością ostatniego wykonanego wyrażenia.)
.Ip "reverse \s-1LISTA\s0" 8
.IX Item "reverse \s-1LIST\s0"
W kontekście listowym, zwraca wartość listową, składającą się z elementów
\s-1LISTY\s0, ułożonych w przeciwnym porządku. W kontekście skalarnym,
elementy listy są łączone w łańcuch i zwracane w odwróconym porządku.
.Sp
.Vb 1
\& print reverse <>; # line tac, last line first
.Ve
.Vb 2
\& undef $/; # for efficiency of <>
\& print scalar reverse <>; # byte tac, last line tsrif
.Ve
Operator ten jest też przydatny do inwersji tablicy asocjacyjnej, choć są tu
pewne zastrzeżenia. Jeśli wartość jest w oryginalnej tablicy zduplikowana,
to tylko jedna z nich może być reprezentowana jako klucz w tablicy
odwróconej. Musi to też przewinąć całą tablicę i zbudować nową, co dla dużej
tablicy może trochę potrwać.
.Sp
.Vb 1
\& %by_name = reverse %by_address; # Inwersja tablicy asocjacyjnej
.Ve
.Ip "rewinddir \s-1UCHWYTKATALOGU\s0" 8
.IX Item "rewinddir \s-1DIRHANDLE\s0"
Ustawia bieżącą pozycję (dla funkcji \fIreaddir()\fR) na początek katalogu,
wskazywanego przez \s-1UCHWYTKATALOGU\s0.
.Ip "rindex \s-1STR\s0,\s-1SUBSTR\s0,\s-1POZYCJA\s0" 8
.IX Item "rindex \s-1STR\s0,\s-1SUBSTR\s0,\s-1POSITION\s0"
.Ip "rindex \s-1STR\s0,\s-1SUBSTR\s0" 8
.IX Item "rindex \s-1STR\s0,\s-1SUBSTR\s0"
Działa tak samo jak index, lecz zwraca pozycję ostatniego pojawienia się
\s-1SUBSTR\s0 w \s-1STR\s0. Jeśli podano \s-1POZYCJĘ\s0, to zwracane jest
ostatnie pojawienie na, lub przed tą pozycją.
.Ip "rmdir \s-1NAZWAPLIKU\s0" 8
.IX Item "rmdir \s-1FILENAME\s0"
.Ip "rmdir" 8
.IX Item "rmdir"
Kasuje pusty katalog podany przez \s-1NAZWĘPLIKU\s0. Jeśli operacja się
powiedzie, zwraca 1. W przeciwnym wypadku zwracane jest zero i ustawiane
jest \f(CW$!\fR (errno). Jeśli \s-1NAZWAPLIKU\s0 jest pominięta, używane
jest \f(CW$_\fR.
.Ip "s///" 8
.IX Item "s///"
Operator podmienienia. Zobacz stronę \fIperlop\fR(1).
.Ip "scalar \s-1WYRAŻ\s0" 8
.IX Item "scalar \s-1EXPR\s0"
Wymusza interpretację skalarną wyrażenia \s-1WYRAŻ\s0 i zwraca jego wartość.
.Sp
.Vb 1
\& @counts = ( scalar @a, scalar @b, scalar @c );
.Ve
Nie istnieje odpowiednik, konwertujący skalar w listę. Jest tak dlatego, że
w praktyce nie jest on nigdy potrzebny. Jeśli jednak naprawdę chcesz tak
zrobić, możesz użyć konstrukcji \f(CW@{[ (jakieś wyrażenie) ]}\fR,
a zwykle powinno wystarczyć zwykłe \f(CW(some expression)\fR.
.Ip "seek \s-1UCHWYTPLIKU\s0,\s-1POZYCJA\s0,\s-1GDZIE\s0" 8
.IX Item "seek \s-1FILEHANDLE\s0,\s-1POSITION\s0,\s-1WHENCE\s0"
Ustawia pozycję \s-1UCHWYTUPLIKU\s0, podobnie jak \fIfseek\fR(3) w stdio.
\s-1UCHYTPLIKU\s0 może być wyrażeniem, którego wartość daje nazwę uchwytu
pliku. Wartości \s-1GDZIE\s0 to 0, oznaczające ustawianie nowej pozycji na
\s-1POZYCJĘ\s0, 1 oznaczające ustawianie pozycji na pozycję bieżącą plus
\s-1POZYCJĘ\s0, oraz 2 ustawiające pozycję na EOF plus \s-1POZYCJĘ\s0
(zazwyczaj ujemną).
Zamiast numerycznych wartości \s-1GDZIE\s0, można używać stałych
\s-1SEEK_SET\s0, \s-1SEEK_CUR\s0 i \s-1SEEK_END\s0 z modułu
\s-1IO::\s0Seekable lub \s-1POSIX\s0. Po sukcesie zwracane jest 1, po
błędzie 0.
.Sp
Jeśli chcesz ustawić pozycję pliku dla \fIsysread()\fR i \fIsyswrite()\fR,
nie używaj \fIseek()\fR -- użyj \fIsysseek()\fR.
.Sp
Na niektórych systemach musisz wykonać seek za każdym razem, gdy przełączasz
się między zapisem i odczytem. Wśród innych rzeczy, może to mieć efekt
wołania funkcji stdio \fIclearerr\fR\|(3). Wartość \s-1GDZIE\s0 1 jest
przydatna do nie ruszania się z pozycji pliku:
.Sp
.Vb 1
\& seek(TEST,0,1);
.Ve
Jest to również przydatne dla aplikacji, emulujących \f(CWtail \-f\fR. Gdy
raz wejdziesz na \s-1EOF\s0, a potem zaśniesz na chwilę, to dobrze przed
następnym odczytem użyć \fIseek()\fR, aby wszystko zresetować. \fIseek()\fR
nie zmienia bieżącej pozycji, lecz \fIczyści\fR warunek EOF uchwytu, więc
następne \f(CW<PLIK>\fR powoduje, że perl znów coś będzie próbował odczytać.
Mamy przynajmniej taką nadzieję.
.Sp
Jeśli to nie działa (niektóre stdio są szczególnie dziwne), to możesz
potrzebować czegoś więcej, jak:
.Sp
.Vb 7
\& for (;;) {
\& for ($curpos = tell(FILE); $_ = <FILE>; $curpos = tell(FILE)) {
\& # szukaj jakichś rzeczy i wstaw je do plików
\& }
\& sleep($for_a_while);
\& seek(FILE, $curpos, 0);
\& }
.Ve
.Ip "seekdir \s-1UCHWYTKATALOGU\s0,\s-1POZYCJA\s0" 8
.IX Item "seekdir \s-1DIRHANDLE\s0,\s-1POS\s0"
Ustawia bieżącą pozycję polecenia \fIreaddir()\fR dla katalogu wskazywanego
przez \s-1UCHWYTKATALOGU\s0. \s-1POZYCJA\s0 musi mieć wartość zwracaną
przez \fItelldir()\fR.
.Ip "select \s-1UCHWYTPLIKU\s0" 8
.IX Item "select \s-1FILEHANDLE\s0"
.Ip "select" 8
.IX Item "select"
Zwraca obecnie wybrany uchwyt pliku. Jeśli podano \s-1UCHWYTPLIKU\s0,
ustawia domyślny uchwyt pliku dla wyjścia. Daje to dwa efekty: po pierwsze
\f(CWwrite\fR, lub \f(CWprint\fR bez uchwytu pliku będą zapisywały domyślnie
do tego \s-1UCHWYTUPLIKU\s0. Po drugie, odniesienia zmiennych, związanych z
wyjściem, będą się odnosiły do tego kanału wyjścia. Np. jeśli masz ustawić
początek formatu formy dla więcej niż jednego kanału, mógłbyś użyć
następującego:
.Sp
.Vb 4
\& select(REPORT1);
\& $^ = 'report1_top';
\& select(REPORT2);
\& $^ = 'report2_top';
.Ve
\s-1UCHWYTPLIKU\s0 może być wyrażeniem, które daje nazwę rzeczywistego
uchwytu pliku. Tak więc:
.Sp
.Vb 1
\& $oldfh = select(STDERR); $| = 1; select($oldfh);
.Ve
Niektórzy programiści wolą myśleć o uchwytach pliku jak o obiektach,
posiadających metody, zapisując ostatni przykład jako:
.Sp
.Vb 2
\& use IO::Handle;
\& STDERR->autoflush(1);
.Ve
.Ip "select \s-1RBITS\s0,\s-1WBITS\s0,\s-1EBITS\s0,\s-1TIMEOUT\s0" 8
.IX Item "select \s-1RBITS\s0,\s-1WBITS\s0,\s-1EBITS\s0,\s-1TIMEOUT\s0"
Funkcja ta woła z podanymi maskami bitowymi wywołanie systemowe
\fIselect\fR\|(2). Maski można skonstruować, używając \fIfileno()\fR i
\fIvec()\fR:
.Sp
.Vb 4
\& $rin = $win = $ein = '';
\& vec($rin,fileno(STDIN),1) = 1;
\& vec($win,fileno(STDOUT),1) = 1;
\& $ein = $rin | $win;
.Ve
Jeśli chcesz wykonywać tę funkcję na wielu uchwytach plików, możesz napisać
podprocedurę:
.Sp
.Vb 9
\& sub fhbits {
\& local(@fhlist) = split(' ',$_[0]);
\& local($bits);
\& for (@fhlist) {
\& vec($bits,fileno($_),1) = 1;
\& }
\& $bits;
\& }
\& $rin = fhbits('STDIN TTY SOCK');
.Ve
Spotykanym idiomem jest:
.Sp
.Vb 2
\& ($nfound,$timeleft) =
\& select($rout=$rin, $wout=$win, $eout=$ein, $timeout);
.Ve
aby blokować, aż coś stanie się gotowe, wykonaj po prostu
.Sp
.Vb 1
\& $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef);
.Ve
Większość systemów nie zwraca niczego mądrego w \f(CW$timeleft\fR, więc
wywołanie \fIselect()\fR w kontekście skalarnym zwróci po prostu \f(CW$nfound\fR.
.Sp
Każda z masek bitowych może być niezdefiniowana. Podany timeout jest
podawany w sekundach. Może być ułamkowy. Uwaga: nie wszystkie implementacje
zwracają \f(CW$timeleft\fR. Jeśli go nie zwracają, to zwracają wartość równą
tej, przekazanej w \f(CW$timeout\fR.
.Sp
A oto 250 milisekundowe zaśnięcie:
.Sp
.Vb 1
\& select(undef, undef, undef, 0.25);
.Ve
\fB\s-1UWAGA\s0\fR: Nie próbuj łączyć buforowanego I/O (np. \fIread\fR czy
\fR<\s-1FH\s0>) z funkcją \fIselect\fR. Użyj zamiast tego \fIsysread()\fR.
.Ip "semctl \s-1ID\s0,\s-1SEMNUM\s0,\s-1CMD\s0,\s-1ARG\s0" 8
.IX Item "semctl \s-1ID\s0,\s-1SEMNUM\s0,\s-1CMD\s0,\s-1ARG\s0"
Woła funkcję IPC \fIsemctl\fR(2) z Systemu V. Jeśli \s-1CMD\s0 to &\s-1IPC_STAT\s0
lub &\s-1GETALL\s0, to \s-1ARG\s0 musi być zmienną, która będzie
przechowywać zwróconą strukturę semid_ds, lub tablicę wartości semafora.
Podczas błędu, podobnie jak ioctl zwraca wartość niezdefiniowaną, dla zera
łańcuch \*(L"0 but true\*(R", a dla pozostałych wartości rzeczywistą wartość
zwróconą.
.Ip "semget \s-1KLUCZ\s0,\s-1NSEMS\s0,\s-1FLAGI\s0" 8
.IX Item "semget \s-1KEY\s0,\s-1NSEMS\s0,\s-1FLAGS\s0"
Woła funkcję IPC \fIsemget\fR(2) z Systemu V. Zwraca identyfikator semafora,
lub wartość niezdefiniowaną w przypadku błędu.
.Ip "semop \s-1KLUCZ\s0,\s-1ŁAŃCUCHOP\s0" 8
.IX Item "semop \s-1KEY\s0,\s-1OPŁAŃCUCH\s0"
Woła funkcję IPC \fIsemop\fR(2) z Systemu V. Funkcja ta dokonuje operacji
semaforowych, np. sygnalizowania i czekania. \s-1ŁAŃCUCHOP\s0 musi być
spakowaną tablicą struktur semop. Każdą ze struktur semop można wygenerować
z pomocą
\f(CWpack("sss", $semnum, $semop, $semflag)\fR.
Liczba operacji semaforowych jest implikowana długością \s-1ŁAŃCUCHOP\s0. Po
sukcesie, funkcja zwraca \s-1TRUE\s0, a w wypadku błędu \s-1FALSE\s0. Na
przykład następujący fragment kodu oczekuje na semaforze
\f(CW$semnum\fR z identyfikatora \f(CW$semid:\fR
.Sp
.Vb 2
\& $semop = pack("sss", $semnum, \-1, 0);
\& die "Problem z semaforem: $!\en" unless semop($semid, $semop);
.Ve
Aby ustawić semafor, zamień \*(L"\-1\*(R" na \*(L"1\*(R".
.Ip "send \s-1GNIAZDO\s0,\s-1MSG\s0,\s-1FLAGI\s0,\s-1DO\s0" 8
.IX Item "send \s-1SOCKET\s0,\s-1MSG\s0,\s-1FLAGS\s0,\s-1TO\s0"
.Ip "send \s-1GNIAZDO\s0,\s-1MSG\s0,\s-1FLAGI\s0" 8
.IX Item "send \s-1SOCKET\s0,\s-1MSG\s0,\s-1FLAGS\s0"
Wysyła na gniazdo komunikat. Pobiera takie same flagi, jak wywołanie
systemowe \fIsend\fR(2). Na gniazdach niepodłączonych, należy podać cel
wysyłania, czyli argument \s-1DO\s0. W tej sytuacji użyta zostanie funkcja C
\fIsendto\fR(2). Funkcja zwraca liczbę wysłanych znaków, lub w wypadku błędu
wartość niezdefiniowaną.
Zobacz jeszcze sekcję \fI\s-1UDP\s0: Message Passing\fR w podręczniku
\fIperlipc\fR(1). Są tam przykłady.
.Ip "setpgrp \s-1PID\s0,\s-1PGRP\s0" 8
.IX Item "setpgrp \s-1PID\s0,\s-1PGRP\s0"
Ustawia bieżącą grupę procesów dla podanego \s-1PID\s0a (wynoszącego 0 dla
procesu bieżącego). Funkcja powoduje błąd krytyczny na maszynach nie
implementujących \fIsetpgrp\fR\|(2). Jeśli argumenty są pominięte, odnosi
się to domyślnie do 0,0. Zauważ, że wersja \s-1POSIX\s0 \fIsetpgrp()\fR nie
przyjmuje żadnych argumentów, więc przenośne jest tylko setpgrp 0,0.
.Ip "setpriority \s-1CZYJE\s0,\s-1KTO\s0,\s-1PRIORYTET\s0" 8
.IX Item "setpriority \s-1WHICH\s0,\s-1WHO\s0,\s-1PRIORITY\s0"
Ustawia bieżący priorytet procesu, grupy procesów, lub użytkownika. (Zobacz
\fIsetpriority\fR\|(2).) Na maszynach nie implementujących tego wywołania
systemowego, powoduje błąd krytyczny.
.Ip "setsockopt \s-1GNIAZDO\s0,\s-1POZIOM\s0,\s-1NAZWAOPC\s0,\s-1WARTOPC\s0" 8
.IX Item "setsockopt \s-1SOCKET\s0,\s-1LEVEL\s0,\s-1OPTNAME\s0,\s-1OPTVAL\s0"
Ustawia żądaną opcję gniazda. W wypadku błędu, zwraca wartość
niezdefiniowaną. Jeśli nie chcesz przekazywać argumentu, \s-1WARTOPC\s0 może
być podane jako undef.
.Ip "shift \s-1TABLICA\s0" 8
.IX Item "shift \s-1ARRAY\s0"
.Ip "shift" 8
.IX Item "shift"
Wysuwa pierwszą wartość tablicy i zwraca ją, skracając tablicę o 1 i
przenosząc wszystko w dół. Jeśli w tablicy nie ma elementów, zwracana jest
wartość niezdefiniowana. Jeśli \s-1TABLICA\s0 zostanie pominięta, to
przesuwana jest w programie głównym tablica \f(CW@ARGV\fR, oraz \f(CW@_\fR w
podprocedurach. (Jest to określone leksykalnie.) Zobacz też
\fIunshift()\fR, \fIpush()\fR oraz \fIpop()\fR.
\fIShift()\fR i \fIunshift()\fR robią to samo na lewym końcu tablicy, co
\fIpop()\fR i \fIpush()\fR na prawym.
.Ip "shmctl \s-1ID\s0,\s-1CMD\s0,\s-1ARG\s0" 8
.IX Item "shmctl \s-1ID\s0,\s-1CMD\s0,\s-1ARG\s0"
Woła funkcję IPC \fIshmctl\fR(2) z Systemu V. Jeśli \s-1CMD\s0 jest &\s-1IPC_STAT\s0,
to \s-1ARG\s0 musi być zmienną, która będzie przechowywać zwróconą strukturę
shmid_ds. Wartość zwracana jest jak w ioctl: wartość niezdefiniowana dla
błędu, \*(L"0 but true\*(R" dla zera i rzeczywista wartość zwrócona w innych
wypadkach.
.Ip "shmget \s-1KLUCZ\s0,\s-1ROZMIAR\s0,\s-1FLAGI\s0" 8
.IX Item "shmget \s-1KEY\s0,\s-1SIZE\s0,\s-1FLAGS\s0"
Woła funkcję IPC \fIshmget\fR(2) z Systemu V. Zwraca identyfikator pamięci
dzielonej, a w przypadku błędu wartość niezdefiniowaną.
.Ip "shmread \s-1ID\s0,\s-1ZMIENNA\s0,\s-1POZYCJA\s0,\s-1ROZMIAR\s0" 8
.IX Item "shmread \s-1ID\s0,\s-1VAR\s0,\s-1POS\s0,\s-1SIZE\s0"
.Ip "shmwrite \s-1ID\s0,\s-1ŁAŃCUCH\s0,\s-1POZYCJA\s0,\s-1ROZMIAR\s0" 8
.IX Item "shmwrite \s-1ID\s0,\s-1ŁAŃCUCH\s0,\s-1POS\s0,\s-1SIZE\s0"
Odczytuje, lub zapisuje segment pamięci dzielonej, rozpoczynając w pozycji
\s-1POZYCJA\s0 i obsługując rozmiar \s-1ROZMIAR\s0 bajtów.
Podczas odczytu, \s-1ZMIENNA\s0 musi być elementem, który będzie
przechowywał odczytane dane. Podczas zapisywania, jeśli \s-1ŁAŃCUCH\s0 jest
zbyt długi, użytych zostanie tylko \s-1ROZMIAR\s0 bajtów; jeśli
\s-1ŁAŃCUCH\s0 jest zbyt krótki, to reszta zostanie wypełniona nullami.
Funkcja zwraca po sukcesie \s-1TRUE\s0 oraz \s-1FALSE\s0 w wypadku błędu.
.Ip "shutdown \s-1GNIAZDO\s0,\s-1JAK\s0" 8
.IX Item "shutdown \s-1SOCKET\s0,\s-1HOW\s0"
Wyłącza połączenie na gnieździe, w sposób wskazany przez \s-1JAK\s0, który
ma taką samą interpretację, jak w wywołaniu systemowym \fIshutdown\fR(2).
.Ip "sin \s-1WYRAŻ\s0" 8
.IX Item "sin \s-1EXPR\s0"
.Ip "sin" 8
.IX Item "sin"
Zwraca sinus z \s-1WYRAŻ\s0 (podanego w radianach). Jeśli \s-1WYRAŻ\s0 jest
pominięte, zwracana jest wartość dla \f(CW$_\fR.
.Sp
Dla operacji odwrotnej do sinusa, możesz użyć funkcji
\fI\s-1POSIX::\s0asin()\fR, lub następującej relacji:
.Sp
.Vb 1
\& sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) }
.Ve
.Ip "sleep \s-1WYRAŻ\s0" 8
.IX Item "sleep \s-1EXPR\s0"
.Ip "sleep" 8
.IX Item "sleep"
Powoduje, że skrypt zasypia na \s-1WYRAŻ\s0 sekund, lub na zawsze, jeśli nie
podano \s-1WYRAŻ\s0. Spanie można przerwać, przesyłając procesowi
\s-1SIGALRM\s0. Zwraca ilość przespanych sekund. Przypuszczalnie nie powinno
się łączyć wywołań \fIalarm()\fR i \fIsleep()\fR, gdyż \fIsleep()\fR jest
często implementowane przy użyciu \fIalarm()\fR.
.Sp
Na niektórych systemach, spanie może trwać do sekundy mniej niż żądałeś,
zależnie od sposobu obliczania sekund. Większość nowoczesnych systemów
przesypia cały okres.
.Sp
Dla pauz, lub większej dokładności niż sekunda, możesz użyć interfejsu
\fIsyscall()\fR perla i dostać się do funkcji \fIsetitimer\fR\|(2),
o ile jest ona obsługiwana przez twój system. Możesz też zapoznać się z
opisem \f(CWselect()\fR, znajdującym się gdzieś w tym dokumencie.
.Sp
Zobacz także funkcję \fIsigpause()\fR z modułu \s-1POSIX\s0.
.Ip "socket \s-1GNIAZDO\s0,\s-1DOMENA\s0,\s-1TYP\s0,\s-1PROTOKÓŁ\s0" 8
.IX Item "socket \s-1SOCKET\s0,\s-1DOMAIN\s0,\s-1TYPE\s0,\s-1PROTOCOL\s0"
Otwiera gniazdo podanego typu i przywiązuje je do uchwytu pliku
\s-1GNIAZDO\s0. \s-1DOMENA\s0, \s-1TYP\s0 i \s-1PROTOKÓŁ\s0 są takie same
jak dla wywołania systemowego socket(2). Przed używaniem tej funkcji,
powinieneś użyć \*(L"use Socket;\*(R", aby zaimportować odpowiednie definicje.
Obejrzyj przykład w sekcji \fISockets: Client/Server Communication\fR w
podręczniku \fIperlipc\fR(1).
.Ip "socketpair \s-1GNIAZDO1\s0,\s-1GNIAZDO2\s0,\s-1DOMENA\s0,\s-1TYP\s0,\s-1PROTOKÓŁ\s0" 8
.IX Item "socketpair \s-1SOCKET1\s0,\s-1SOCKET2\s0,\s-1DOMAIN\s0,\s-1TYPE\s0,\s-1PROTOCOL\s0"
Tworzy nienazwaną parę gniazd danego typu, w podanej domenie. \s-1DOMENA\s0,
\s-1TYP\s0 i \s-1PROTOKÓŁ\s0 są podawane tak samo, jak dla wywołania
systemowego socketpair(2). Jeśli funkcja nie jest zaimplementowana, to
powoduje błąd krytyczny. Po sukcesie zwracane jest \s-1TRUE\s0.
.Ip "sort \s-1NAZWA\s0 \s-1LISTA\s0" 8
.IX Item "sort \s-1SUBNAME\s0 \s-1LISTA\s0"
.Ip "sort \s-1BLOK\s0 \s-1LISTa\s0" 8
.IX Item "sort \s-1BLOK\s0 \s-1LISTA\s0"
.Ip "sort \s-1LISTA\s0" 8
.IX Item "sort \s-1LISTA\s0"
Sortuje \s-1LISTĘ\s0 i zwraca posortowaną wartość listową. Jeśli pominięte
zostaną parametry \s-1NAZWA\s0 lub \s-1BLOK\s0, sortowanie następuje w
porządku porównywania łańcuchów. Jeśli podano \s-1NAZWĘ\s0, to wskazuje ona
na podprocedurę, zwracającą liczbę całkowitą, która jest mniejsza, równa,
lub większa od zera, zależnie od tego, jak elementy tablicy mają być
poukładane. W takich procedurach bardzo przydatne są operatory \f(CW<=>\fR
oraz \f(CWcmp\fR. \s-1NAZWA\s0 może być nazwą zmiennej skalarnej--w tym
wypadku wartość daje nazwę używanej podprocedury. Zamiast \s-1NAZWY\s0 można
podać \s-1BLOK\s0, czyli anonimową podprocedurę sortującą.
.Sp
W celu polepszenia efektywności, pomijany jest normalny kod wołania
podprocedur: podprocedura nie może być rekurencyjna, a dwa porównywane
elementy nie są przekazywane przez \f(CW@_\fR, lecz jako globalne zmienna
pakietu \f(CW$a\fR oraz \f(CW$b\fR (zobacz przykład poniżej). Są one
przekazywane przez referencję, więc nie modyfikuj ani \f(CW$a\fR, ani
\f(CW$b\fR. Nie próbuj też deklarować ich jako leksykalne.
.Sp
Nie można też wyjść z bloku sortującego przy użyciu żadnego operatora kontroli
pętli czy \fIgoto()\fR.
.Sp
Gdy działa \f(CWuse locale\fR, \f(CWsort LIST\fR sortuje \s-1LISTĘ\s0
według odpowiedniego locale. Zobacz stronę \fIperllocale\fR(1).
.Sp
Przykłady:
.Sp
.Vb 2
\& # sortuj leksykalnie
\& @articles = sort @files;
.Ve
.Vb 2
\& # to samo, z jawną procedurą sortującą
\& @articles = sort {$a cmp $b} @files;
.Ve
.Vb 2
\& # teraz niewrażliwie na wielkość liter
\& @articles = sort {uc($a) cmp uc($b)} @files;
.Ve
.Vb 2
\& # to samo w odwrotnym porządku
\& @articles = sort {$b cmp $a} @files;
.Ve
.Vb 2
\& # sortuj rosnąco, numerycznie
\& @articles = sort {$a <=> $b} @files;
.Ve
.Vb 2
\& # j/w, malejąco
\& @articles = sort {$b <=> $a} @files;
.Ve
.Vb 5
\& # sortuj, używając jawnej nazwy podprocedury
\& sub byage {
\& $age{$a} <=> $age{$b}; # założenie numeryczności
\& }
\& @sortedclass = sort byage @class;
.Ve
.Vb 3
\& # to sortuje tablicę asocjacyjną %age według wartości (zamiast klucza)
\& # przy użyciu funkcji inline
\& @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
.Ve
.Vb 9
\& sub backwards { $b cmp $a; }
\& @harry = ('dog','cat','x','Cain','Abel');
\& @george = ('gone','chased','yz','Punished','Axed');
\& print sort @harry;
\& # drukuje AbelCaincatdogx
\& print sort backwards @harry;
\& # drukuje xdogcatCainAbel
\& print sort @george, 'to', @harry;
\& # drukuje AbelAxedCainPunishedcatchaseddoggonetoxyz
.Ve
.Vb 3
\& # sortuj nieefektywnie według malejącego porównania numerycznego,
\& # używając pierwszej liczby całkowitej po znaku =, lub w przeciwnym
\& # wypadku cały rekord, bez zwracania uwagi na wielkość liter.
.Ve
.Vb 5
\& @new = sort {
\& ($b =~ /=(\ed+)/)[0] <=> ($a =~ /=(\ed+)/)[0]
\& ||
\& uc($a) cmp uc($b)
\& } @old;
.Ve
.Vb 8
\& # to samo, dużo efektywniej;
\& # zbudujemy zewnętrzne indeksy
\& @nums = @caps = ();
\& for (@old) {
\& push @nums, /=(\ed+)/;
\& push @caps, uc($_);
\& }
.Ve
.Vb 6
\& @new = @old[ sort {
\& $nums[$b] <=> $nums[$a]
\& ||
\& $caps[$a] cmp $caps[$b]
\& } 0..$#old
\& ];
.Ve
.Vb 6
\& # to samo, przy użyciu Schwartzian Transform (bez tymczasowych)
\& @new = map { $_->[0] }
\& sort { $b->[1] <=> $a->[1]
\& ||
\& $a->[2] cmp $b->[2]
\& } map { [$_, /=(\ed+)/, uc($_)] } @old;
.Ve
Jeśli używasz strict, nie możesz deklarować \f(CW$a\fR i \f(CW$b\fR jako
leksykalia. Są one pakietowymi globaliami. Znaczy to, że jeśli jesteś w
pakiecie głównym (\f(CWmain\fR), to jest to
.Sp
.Vb 1
\& @articles = sort {$main::b <=> $main::a} @files;
.Ve
kub po prostu
.Sp
.Vb 1
\& @articles = sort {$::b <=> $::a} @files;
.Ve
lecz jeśli jesteś w pakiecie \f(CWFooPack\fR, to jest to
.Sp
.Vb 1
\& @articles = sort {$FooPack::b <=> $FooPack::a} @files;
.Ve
Funkcja porównująca musi się zachowywać [jednoznacznie]. Jeśli zwraca
niespójne, nielogiczne wyniki (np. czasem mówiąc, że \f(CW$x\fR[1] jest mniejsze
niż \f(CW$x\fR[2], a czasem odwrotnie), to interpreter perla prawdopodobnie
się wysypie i zrzuci core.
Wynika to całkowicie z zależności od systemowej funkcji bibliotecznej
\fIqsort\fR\|(3); funkcja ta często nie dokonuje pewnych sprawdzeń w
celu polepszenia szybkości.
.Ip "splice \s-1TABLICA\s0,\s-1OFFSET\s0,\s-1DŁUGOŚĆ\s0,\s-1LISTA\s0" 8
.IX Item "splice \s-1ARRAY\s0,\s-1OFFSET\s0,\s-1LENGTH\s0,\s-1LIST\s0"
.Ip "splice \s-1TABLICA\s0,\s-1OFFSET\s0,\s-1DŁUGOŚĆ\s0" 8
.IX Item "splice \s-1ARRAY\s0,\s-1OFFSET\s0,\s-1LENGTH\s0"
.Ip "splice \s-1TABLICA\s0,\s-1OFFSET\s0" 8
.IX Item "splice \s-1ARRAY\s0,\s-1OFFSET\s0"
Usuwa z tablicy elementy wskazane przez \s-1OFFSET\s0 i \s-1DŁUGOŚĆ\s0, oraz
zamienia je ewentualnie podanymi elementami \s-1LISTY\s0. Zwraca elementy,
które zostały z tablicy usunięte. Tablica zgodnie z potrzebami rośnie, lub
maleje. Jeśli parametr \s-1DŁUGOŚĆ\s0 zostanie pominięty, to usuwane jest
wszystko, poczynając od \s-1OFFSET\s0. A oto pewne równoważności
(zakładając, że \f(CW$[ == 0\fR):
.Sp
.Vb 5
\& push(@a,$x,$y) splice(@a,$#a+1,0,$x,$y)
\& pop(@a) splice(@a,-1)
\& shift(@a) splice(@a,0,1)
\& unshift(@a,$x,$y) splice(@a,0,0,$x,$y)
\& $a[$x] = $y splice(@a,$x,1,$y);
.Ve
Przykład, przy założeniu, że długości tablic są przekazywane przed
tablicami:
.Sp
.Vb 10
\& sub aeq { # porównaj dwie wartości listowe
\& local(@a) = splice(@_,0,shift);
\& local(@b) = splice(@_,0,shift);
\& return 0 unless @a == @b; # ta sama długość?
\& while (@a) {
\& return 0 if pop(@a) ne pop(@b);
\& }
\& return 1;
\& }
\& if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... }
.Ve
.Ip "split /\s-1WZORZEC\s0/,\s-1WYRAŻ\s0,\s-1LIMIT\s0" 8
.IX Item "split /\s-1PATTERN\s0/,\s-1EXPR\s0,\s-1LIMIT\s0"
.Ip "split /\s-1WZORZEC\s0/,\s-1WYRAŻ\s0" 8
.IX Item "split /\s-1PATTERN\s0/,\s-1EXPR\s0"
.Ip "split /\s-1WZORZEC\s0/" 8
.IX Item "split /\s-1PATTERN\s0/"
.Ip "split" 8
.IX Item "split"
Dzieli łańcuch na tablicę łańcuchów i zwraca tę tablicę.
.Sp
Jeśli nie jest w kontekście listowym, to zwraca listę znalezionych pól i
dzieli do tablicy \f(CW@_\fR. (w kontekście listowym możesz wymusić
dzielenie do \f(CW@_\fR, używając jako rozdzielaczy wzorca \f(CW??\fR, lecz
będzie wciąż zwracać wartość tablicową.) Używanie jawnego dzielenia do
\f(CW@_\fR nie jest jednak zalecane.
.Sp
Jeśli \s-1WYRAŻ\s0 jest pominięty, dzielony jest łańcuch \f(CW$_\fR. Jeśli
pominięty jest też \s-1WZORZEC\s0, dzielenie następuje na białych spacjach
(po pominięciu wszelkich prowadzących białych spacji). Wszystko,
odpowiadające \s-1WZORCOWI\s0 jest uważane za rozdzielacz pól. (Zauważ, że
rozdzielacz może być dłuższy niż jeden znak.) Jeśli podano wartość
\s-1LIMIT\s0 i nie jest to liczba ujemna, dzielenie następuje do nie więcej
niż tej ilości pól. Jeśli \s-1LIMIT\s0 nie jest podany, kończące wypełnienia
nullowe są obcinane (co dobrze pamiętać użytkownikom \fIpop()\fR). Jeśli
\s-1LIMIT\s0 jest ujemny, to jest traktowany tak, jakby podano arbitralnie duży
\s-1LIMIT\s0.
.Sp
Wzorzec, odpowiadający łańcuchowi null (żeby nie być zmylonym ze wzorcem null
\f(CW//\fR, który jest tylko jednym członkiem z zestawu wzorców
odpowiadających łańcuchowi null) będzie dzielił wartość \s-1WYRAŻ\s0 na
oddzielne znaki w każdym punkcie, który odpowie zapytaniu.
Na przykład:
.Sp
.Vb 1
\& print join(':', split(/ */, 'hi there'));
.Ve
da w wyniku \*(L'h:i:t:h:e:r:e\*(R'.
.Sp
Parametr \s-1LIMIT\s0 może być użyty do podzielenia linii częściowo
.Sp
.Vb 1
\& ($login, $passwd, $remainder) = split(/:/, $_, 3);
.Ve
Podczas przypisywania do listy, jeśli nie podano \s-1LIMITU\s0, perl ustawia
domyślny limit wielkości o 1 większej niż lista zmiennych na liście,
zapobiegając tak niepotrzebnej pracy. Dla powyższej listy, \s-1LIMIT\s0
byłby ustawiony domyślnie na 4. W aplikacjach, gdzie czas jest krytycznym
czynnikiem, powstrzymuje cię to od dzielenia na więcej pól, niż rzeczywiście
potrzebujesz.
.Sp
Jeśli \s-1WZORZEC\s0 zawiera nawiasy, z łańcuchów odpowiadającym
podłańcuchom rozdzielacza tworzone są dodatkowe elementy tablicy.
.Sp
.Vb 1
\& split(/([,-])/, "1-10,20", 3);
.Ve
daje wartość listową
.Sp
.Vb 1
\& (1, '-', 10, ',', 20)
.Ve
Jeśli masz cały nagłówek normalnego unixowego komunikatu pocztowego w
nagłówku \f(CW$header\fR, to możesz rozdzielić go na pola i wartości w
następujący sposób:
.Sp
.Vb 2
\& $header =~ s/\en\es+/ /g; # obsłuż linie kontynuacji
\& %hdrs = (UNIX_FROM => split /^(.*?):\es*/m, $header);
.Ve
Wzorzec \f(CW/WZORZEC/\fR może być zamieniony wyrażeniem, umożliwiając tak
podawanie wzorców, które zmieniają się w czasie. (aby dokonać kompilacji
czasu działania tylko raz, użyj \f(CW/$variable/o\fR.)
.Sp
Specjalnym przypadkiem jest podanie jako \s-1WZORZEC\s0 spacji (\f(CW' '\fR).
Będzie to powodować dzielenie na białych spacjach, podobnie jak domyślna
wersja split. Tak więc \fIsplit\fR\|(' \*(L') może być używany do domyślnego
zachowania \fBawk\fR, gdzie \f(CWsplit(/ /)\fR daje tyle łańcuchów null, ile
jest prowadzących białych spacji. Split dla /\es+/ jest podobny do
\fIsplit\fR\|(' \*(L'), lecz dowolna biała spacja powoduje null na pierwszym
polu. Split bez argumentów dokonuje w rzeczywistości wewnętrznie
\f(CWsplit(' ', $_)\fR.
.Sp
Przykład:
.Sp
.Vb 6
\& open(passwd, '/etc/passwd');
\& while (<passwd>) {
\& ($login, $passwd, $uid, $gid, $gcos,
\& $home, $shell) = split(/:/);
\& ...
\& }
.Ve
(Zauważ, że \f(CW$shell\fR w powyższym będzie miał za sobą nową linię.
Aby ją usunąć, zapoznaj się z funkcjami \f(CWchop\fR, \f(CWchomp\fR i
\f(CWjoin\fR, opisanymi gdzieś w tym dokumencie.)
.Ip "sprintf \s-1FORMAT\s0, \s-1LISTA\s0" 8
.IX Item "sprintf \s-1FORMAT\s0, \s-1LIST\s0"
Zwraca łańcuch, sformatowany według konwencji printf, funkcji bibliotecznej
języka C, \fIsprintf\fR(3).
.Sp
Perl emuluje funkcję C \fIsprintf()\fR, lecz nie używa jej (poza liczbami
zmiennoprzecinkowymi, a nawet wtedy dozwolone są tylko standardowe
modyfikatory). W wyniku, w perlu nie są dostępne żadne niestandardowe
rozszerzenia lokalnej wersji \fIsprintf()\fR.
.Sp
Perlowy \fIsprintf()\fR zezwala na następujące, ogólnie znane konwersje:
.Sp
.Vb 10
\& %% znak procentu
\& %c znak o podanym kodzie
\& %s łańcuch
\& %d integer ze znakiem, dziesiętnie
\& %u integer bez znaku, dziesiętnie
\& %o integer bez znaku, ósemkowo
\& %x integer bez znaku, szesnastkowo
\& %e liczba zmiennoprzecinkowa w notacji naukowej
\& %f liczba zmiennoprzecinkowa w ustalonej notacji dziesiętnej
\& %g liczba zmiennoprzecinkowa w notacji %e lub %f
.Ve
Dodatkowo, perl zezwala na następujące szeroko-obsługiwane konwersje:
.Sp
.Vb 6
\& %X podobne do %x, lecz na dużych literach
\& %E podobne do %e, lecz z użyciem dużego E
\& %G podobne do %g, lecz z użyciem dużego E
\& %p wskaźnik (daje adres wartości, podany szesnastkowo)
\& %n specjalne: przechowuje liczbę dotychczas wpisanych do następnej
\& zmiennej z listy parametrów
.Ve
I w końcu, dla kompatybilności wstecznej, perl zezwala na poniższe zbyteczne,
lecz szeroko obsługiwane konwersje:
.Sp
.Vb 5
\& %i synonim %d
\& %D synonim %ld
\& %U synonim %lu
\& %O synonim %lo
\& %F synonim %f
.Ve
Perl zezwala na użycie następujących uniwersalnych flag między znakiem
\f(CW%\fR, a literą konwersji:
.Sp
.Vb 10
\& spacja poprzedź liczbę dodatnią spacją
\& + poprzedź liczbę dodatnią plusem
\& - wyrównuj do lewej w obszarze pola
\& 0 użyj zer zamiast spacji do wyrównywania w prawo
\& # poprzedź liczbę ósemkową "0", szesnastkową "0x"
\& liczba minimalna wielkość pola
\& .liczba "precyzja": liczba cyfr po kropce dziesiętnej dla
\& zmiennoprzecinkowych, maksymalna długość dla łańcucha, lub
\& minimalna długość dla liczby całkowitej (integer)
\& l interpretuj integer jak typ C "long", lub "unsigned long"
\& h interpretuj integer jak typ C "short", lub "unsigned short"
.Ve
Istnieje też jedna flaga specyficzna dla perla:
.Sp
.Vb 1
\& V interpretuj integer jako standardowy typ integera w perlu
.Ve
Tam, gdzie we flagach pojawia się liczba, można użyć gwiazdki ("*"). W tym
wypadku perl używa zamiast liczby wartości następnego argumentu z listy
parametrów. Jeśli szerokość pola, uzyskana przez \*(L"*\*(R"
jest ujemna, to ma to samo działanie, co flaga \*(L'\-\*(R':
wyrównywanie do lewej.
.Sp
Jeśli działa \f(CWuse locale\fR, znaki używane do kropki dziesiętnej będą
drukowane według locale \s-1LC_NUMERIC\s0. Zobacz stronę
\fIperllocale\fR(1).
.Ip "sqrt \s-1WYRAŻ\s0" 8
.IX Item "sqrt \s-1EXPR\s0"
.Ip "sqrt" 8
.IX Item "sqrt"
Zwraca pierwiastek kwadratowy z \s-1WYRAŻ\s0. Jeśli \s-1WYRAŻ\s0 jest
pominięte, zwraca wartość dla \f(CW$_\fR.
.Ip "srand \s-1WYRAŻ\s0" 8
.IX Item "srand \s-1EXPR\s0"
.Ip "srand" 8
.IX Item "srand"
Ustawia nasionko liczby losowej dla operatora \f(CWrand\fR. Jeśli pominięte
zostanie \s-1WYRAŻ\s0, używana jest pseudolosowa wartość, oparta o bieżący
czas i identyfikator procesu. W wersjach perla wcześniejszych niż 5.004,
domyślnym nasionkiem był po prostu bieżący czas \fItime()\fR. Nie jest to
szczególnie dobre nasionko, więc wiele starych programów załączało swoją
własną wartość inicjującą (często \f(CWtime ^ $$\fR, lub
C<time ^ ($$ + ($$ << 15))>), lecz teraz nie jest to konieczne.
.Sp
W rzeczywistości, zazwyczaj w ogóle nie jest konieczne wywoływanie
\fIsrand\fR, ponieważ jest ono wywoływane niejawnie przy pierwszym użyciu
operatora \f(CWrand\fR. Jednak nie było tak w wersjach wcześniejszych niż
perl 5.005, więc jeśli twój skrypt ma działać ze starszymi wersjami,
powinien jednak wołać \fIsrand()\fR.
.Sp
Zauważ, że dla potrzeb kryptografii potrzebujesz czegoś więcej niż tylko
wylosować domyślne nasionko. Popularną metodą jest sprawdzanie sum
kontrolnych skompresowanego wyjścia z jednego, lub więcej programów szybko
zmieniającego się statusu systemu operacyjnego. Na przykład:
.Sp
.Vb 1
\& srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
.Ve
Jeśli naprawdę ci na tym zależy, zobacz moduł Math::TrulyRandom
w \s-1CPAN\s0.
.Sp
\fINie\fR wołaj \fIsrand()\fR wielokrotnie, chyba że dokładnie wiesz co i w
jakim celu robisz. Celem tej funkcji jest zasilenie funkcji \fIrand()\fR
tak, by \fIrand()\fR zwracał inną sekwencję dla każdego uruchomienia
programu. Zrób to raz, na samym początku programu, bo w przeciwnym wypadku
\fInie\fR uzyskasz z \fIrand()\fR liczb losowych!
.Sp
Często wywoływane programy (takie jak skrypty \s-1CGI\s0), które jako
nasionka używają po prostu
.Sp
.Vb 1
\& time ^ $$
.Ve
mogą paść ofiarą własności matematycznej, że
.Sp
.Vb 1
\& a^b == (a+1)^(b+1)
.Ve
przez jedną trzecią czasu. Więc nie rób tego.
.Ip "stat \s-1UCHWYTPLIKU\s0" 8
.IX Item "stat \s-1FILEHANDLE\s0"
.Ip "stat \s-1WYRAŻ\s0" 8
.IX Item "stat \s-1EXPR\s0"
.Ip "stat" 8
.IX Item "stat"
Zwraca 13 elementową tablicę, opisującą status pliku--otwartego przez
\s-1UCHWYTPLIKU\s0 lub nazwanego przez \s-1WYRAŻ\s0. Jeśli \s-1WYRAŻ\s0
jest pominięte, używany jest \f(CW$_\fR. Gdy funkcja zawiedzie, zwraca listę
null. Zazwyczaj jest to używane następująco:
.Sp
.Vb 3
\& ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
\& $atime,$mtime,$ctime,$blksize,$blocks)
\& = stat($filename);
.Ve
Nie wszystkie z tych pól są obsługiwane na wszystkich rodzajach systemów
plików. Oto znaczenia pól:
.Sp
.Vb 13
\& 0 dev numer urządzenia systemu plików
\& 1 ino numer inode
\& 2 mode prawa pliku (typ i prawa)
\& 3 nlink liczba twardych dowiązań do pliku
\& 4 uid numeryczny UID właściciela
\& 5 gid numeryczny GID właściciela
\& 6 rdev identyfikator urządzenia (tylko dla plików specjalnych)
\& 7 size całkowity rozmiar w bajtach
\& 8 atime ostatni dostęp od epoki
\& 9 mtime ostatnia modyfikacja od epoki
\& 10 ctime ostatnia zmiana inode od epoki
\& 11 blksize preferowany rozmiar bloku dla I/O systemu plików
\& 12 blocks rzeczywista liczba zaalokowanych bloków
.Ve
(Epoka nastąpiła o 00:00 1 stycznia, 1970 \s-1GMT\s0.)
.Sp
Jeśli funkcja dostanie specjalny uchwyt pliku, składający się z
podkreślenia, to nie jest ona wykonywana, lecz przekazywana jest zawartość
ostatniego testu pliku. Przykład:
.Sp
.Vb 3
\& if (\-x $file && (($d) = stat(_)) && $d < 0) {
\& print "$file jest wykonywalnym plikiem NFS\en";
\& }
.Ve
(Działa to tylko na maszynach, dla których numer urządzenia jest ujemny dla
\s-1NFS\s0.)
.Ip "study \s-1SKALAR\s0" 8
.IX Item "study \s-1SCALAR\s0"
.Ip "study" 8
.IX Item "study"
Zajmuje trochę czasu, by przestudiować \s-1SKALAR\s0 (lub \f(CW$_\fR, jeśli
go nie podano), przygotowując się na wiele przeszukiwań wzorców na tym
łańcuchu, przed jego kolejną modyfikacją. Może to pozwolić zyskać na czasie,
zależnie od natury i liczby wzorców, a także od rozłożenia częstotliwości
znaków w przeszukiwanym łańcuchu. Najlepiej sprawdzić empirycznie, czy funkcja
ta wpływa na szybkość dodatnio, czy ujemnie. Najwięcej zyskają pętle,
szukające wielu krótkich, stałych łańcuchów (włączając stałe części bardziej
złożonych wzorców). Naraz można mieć obsługiwany przez study tylko jeden
łańcuch. Jeśli przejdziesz na inny skalar, to poprzedni stanie się
nieprzestudiowany. (study działa następująco: najpierw robiona jest lista
powiązana dla każdego znaku przeszukiwanego łańcucha, tak że wiemy na
przykład gdzie znajdują się wszystkie znaki \*(L'k\*(R'.
W każdym szukanym łańcuchu wybierany jest w oparciu o statyczne tablice
rozkładu najrzadziej występujący znak. Łańcuch jest poszukiwany w miejscach,
gdzie znajduje się ten najrzadszy znak.)
.Sp
Na przykład oto pętla, która wstawia wpisy tworzące indeks przed każdą
linię, zawierającą określony wzorzec:
.Sp
.Vb 8
\& while (<>) {
\& study;
\& print ".IX foo\en" if /\ebfoo\eb/;
\& print ".IX bar\en" if /\ebbar\eb/;
\& print ".IX blurfl\en" if /\ebblurfl\eb/;
\& ...
\& print;
\& }
.Ve
Użycie study spowoduje szukanie /\ebfoo\eb/ tylko w miejscach \f(CW$_\fR,
które zawierają \*(L"f\*(R", gdyż jest to najrzadszy znak. Ogólnie, daje to
duże zyski, poza przypadkami patologicznymi. Jedynym pytaniem jest to, czy
zachowuje ci to więcej czasu niż zabrało zbudowanie powiązanej listy.
.Sp
Zauważ, że jeśli musisz szukać łańcuchów, o których nic nie wiesz, aż do
uruchomienia, to możesz zbudować całą pętlę jako łańcuch i \fIeval\fRować to, by
zapobiec ciągłemu rekompilowaniu wzorców. W połączeniu z czynieniem $/
niezdefiniowanym, aby wessać całe pliki jako jeden rekord, może to być
bardzo szybkie, często szybsze niż specjalizowane programy typu
\fIfgrep\fR\|(1). Następujący przykład skanuje listę plików (\f(CW@files\fR)
w poszukiwaniu listy słów (\f(CW@words\fR) i drukuje nazwy plików,
zawierających odpowiednik:
.Sp
.Vb 12
\& $search = 'while (<>) { study;';
\& foreach $word (@words) {
\& $search .= "++\e$seen{\e$ARGV} if /\e\eb$word\e\eb/;\en";
\& }
\& $search .= "}";
\& @ARGV = @files;
\& undef $/;
\& eval $search; # to krzyczy
\& $/ = "\en"; # ustaw normalny rozdzielacz wejścia
\& foreach $file (sort keys(%seen)) {
\& print $file, "\en";
\& }
.Ve
.Ip "sub \s-1BLOK\s0" 8
.IX Item "sub \s-1BLOCK\s0"
.Ip "sub \s-1NAZWA\s0" 8
.IX Item "sub \s-1NAME\s0"
.Ip "sub \s-1NAZWA\s0 \s-1BLOK\s0" 8
.IX Item "sub \s-1NAME\s0 \s-1BLOCK\s0"
Nie jest to prawdziwa funkcja, lecz definicja podprocedury. Jeśli zawiera
tylko \s-1NAZWĘ\s0 (i przypuszczalnie prototypy), jest to tylko deklaracja.
Bez \s-1NAZWY\s0 jest to deklaracja anonimowej funkcji i zwraca wartość:
referencję \s-1CODE\s0 zawężenia, które właśnie utworzyłeś. Dla dalszych
szczegółów, zobacz stronę podręcznika \fIperlref\fR(1).
.Ip "substr \s-1WYRAŻ\s0,\s-1OFFSET\s0,\s-1DŁUGOŚĆ\s0" 8
.IX Item "substr \s-1EXPR\s0,\s-1OFFSET\s0,\s-1LEN\s0"
.Ip "substr \s-1WYRAŻ\s0,\s-1OFFSET\s0" 8
.IX Item "substr \s-1EXPR\s0,\s-1OFFSET\s0"
Wyciąga z \s-1WYRAŻ\s0 podłańcuch i zwraca go. Pierwszy znak znajduje się pod
offsetem 0, lub tym, na co ustawiłeś \f(CW$[\fR (lecz nie rób tego).
Jeśli \s-1OFFSET\s0 jest ujemny, rozpoczyna się w tej odległości od końca
łańcucha. Jeśli \s-1DŁUGOŚĆ\s0 jest pominięta, zwracane jest wszystko, aż do
końca łańcucha. Jeśli \s-1DŁUGOŚĆ\s0 jest ujemna, pozostawia tyle znaków z
końca łańcucha.
.Sp
Funkcji \fIsubstr()\fR możesz użyć jako lwartości, w którym wypadku
\s-1WYRAŻ\s0 musi być lwartością. Jeśli przyznasz coś krótszego niż
\s-1DŁUGOŚĆ\s0, łańcuch zostanie skrócony, a jeśli coś dłuższego, to łańcuch
zostanie rozciągnięty. Aby zachować stałą długość łańcucha, możesz
potrzebować dopełnić, lub obciąć wartości przy użyciu
\fIsprintf()\fR.
.Ip "symlink \s-1STARYPLIK\s0,\s-1NOWYPLIK\s0" 8
.IX Item "symlink \s-1OLDFILE\s0,\s-1NEWFILE\s0"
Tworzy nową nazwę pliku, dowiązaną symbolicznie do starej. Po sukcesie
zwraca 1, w przeciwnym wypadku 0. Na systemach nie obsługujących dowiązań
symbolicznych, funkcja ta powoduje błąd krytyczny podczas działania. Aby go
wychwycić, użyj eval:
.Sp
.Vb 1
\& $symlink_exists = (eval {symlink("","")};, $@ eq '');
.Ve
.Ip "syscall \s-1LISTA\s0" 8
.IX Item "syscall \s-1LIST\s0"
Wywołuje wywołanie systemowe, podane jako pierwszy element listy,
przekazując resztę elementów jako argumenty wywołania. Jeśli nie jest to
zaimplementowane, powoduje błąd krytyczny. Argumenty są interpretowane
następująco: jeśli podany argument jest numeryczny, przekazywany argument to
int. Jeśli nie, przekazywany jest wskaźnik do wartości tekstowej.
Odpowiadasz za upewnienie się, że łańcuch jest dość długi, by odebrać
określony wynik, który może być do niego zapisany. Jeśli twoje argumenty int
nie są literałami i nie były nigdy interpretowane w kontekście numerycznym,
możesz być zmuszonym dodać do nich 0, aby wymusić na nich wygląd liczbowy.
.Sp
.Vb 2
\& require 'syscall.ph'; # może być niezbędne h2ph
\& syscall(&SYS_write, fileno(STDOUT), "hi there\en", 9);
.Ve
Zauważ, że perl obsługuje przekazywanie do 14 argumentów do wywołania
systemowego, co w praktyce powinno wystarczyć.
.Ip "sysopen \s-1UCHWYTPLIKU\s0,\s-1NAZWAPLIKU\s0,\s-1TRYB\s0" 8
.IX Item "sysopen \s-1FILEHANDLE\s0,\s-1FILENAME\s0,\s-1MODE\s0"
.Ip "sysopen \s-1UCHWYTPLIKU\s0,\s-1NAZWAPLIKU\s0,\s-1TRYB\s0,\s-1PRAWA\s0" 8
.IX Item "sysopen \s-1FILEHANDLE\s0,\s-1FILENAME\s0,\s-1MODE\s0,\s-1PERMS\s0"
Otwiera plik \s-1NAZWAPLIKU\s0 i wiąże go z \s-1UCHWYTEMPLIKU\s0. Jeśli
\s-1UCHWYTPLIKU\s0 jest wyrażeniem, to jego wartość jest używana jako nazwa
rzeczywistego uchwytu pliku. Funkcja ta woła podlegającą jej funkcję systemu
operacyjnego, \f(CWopen\fR z parametrami
\s-1NAZWAPLIKU\s0, \s-1TRYB\s0, \s-1PRAWA\s0.
.Sp
Prawidłowe wartości i bity flag parametru \s-1TRYB\s0 są zależne od systemu;
są one dostępne przez standardowy moduł \f(CWFcntl\fR. Jednak z przyczyn
historycznych, niektóre wartości są uniwersalne;
zero oznacza tylko dla odczytu, jeden tylko dla zapisu, a dwa dla zapisu i
odczytu.
.Sp
Jeśli plik \s-1NAZWAPLIKU\s0 nie istnieje, a wywołanie \f(CWopen\fR go
tworzy (zazwyczaj dlatego, że \s-1TRYB\s0 zawiera flagę O_CREAT), to wartość
\s-1PRAW\s0 określa prawa nowo utworzonego pliku. Jeśli są one pominięte,
używana jest domyślna wartość 0666, która umożliwia wszystkim odczyt i
zapis. Wartość ta ma sens, zobacz \f(CWumask\fR.
.Sp
Moduł \s-1IO::\s0File daje bardziej obiektowe podejście do tych rzeczy.
.Ip "sysread \s-1UCHWYTPLIKU\s0,\s-1SKALAR\s0,\s-1DŁUGOŚĆ\s0,\s-1OFFSET\s0" 8
.IX Item "sysread \s-1FILEHANDLE\s0,\s-1SCALAR\s0,\s-1LENGTH\s0,\s-1OFFSET\s0"
.Ip "sysread \s-1UCHWYTPLIKU\s0,\s-1SKALAR\s0,\s-1DŁUGOŚĆ\s0" 8
.IX Item "sysread \s-1FILEHANDLE\s0,\s-1SCALAR\s0,\s-1LENGTH\s0"
Próbuje odczytać \s-1DŁUGOŚĆ\s0 bajtów danych do zmiennej \s-1SKALAR\s0.
Odczyt następuje z pliku wskazywanego przez \s-1UCHWYTPLIKU\s0, przy użyciu
wywołania systemowego \fIread\fR\|(2). Pomija to stdio, więc łączenie tej
funkcji z innym rodzajami odczytu, z \fIprint()\fR, \fIwrite()\fR,
\fIseek()\fR, lub \fItell()\fR może powodować problemy. Zwraca ilość
odczytanych bajtów, lub undef w wypadku błędu. \s-1SKALAR\s0 będzie
rozciągany tak, by pasował do liczby odczytanych bajtów.
.Sp
Aby spowodować odczyt danych z któregoś miejsca łańcucha (różnego niż
początek), można podać dodatkowo parametr \s-1OFFSET\s0. Jeśli parametr ten
jest ujemny, to wskazywana jest pozycja przesunięta o tyleż bajtów w tył od
końca łańcucha.
Jeśli dodatni offset jest większy od długości \s-1SKALARA\s0, to wynikiem
jest wypełnienie do wymaganego rozmiaru znakami \*(L"\e-\*(R", a następnie
doklejenie odczytu.
.Ip "sysseek \s-1UCHWYTPLIKU\s0,\s-1POZYCJA\s0,\s-1GDZIE\s0" 8
.IX Item "sysseek \s-1FILEHANDLE\s0,\s-1POSITION\s0,\s-1WHENCE\s0"
Zmienia pozycję \s-1UCHWYTUPLIKU\s0 przy użyciu wywołania systemowego
\fIlseek\fR\|(2). Pomija stdio, więc łączenie tego z odczytami (innymi niż
\fIsysread()\fR), z
\fIprint()\fR, \fIwrite()\fR, \fIseek()\fR, lub \fItell()\fR
może wprowadzić problemy. \s-1UCHWYTPLIKU\s0 może być wyrażeniem, którego
wartość daje nazwę uchwytu pliku. Wartości dla \s-1GDZIE\s0 to 0 dla
ustawienia nowej pozycji, 1 dla dodania nowej pozycji do bieżącej i 2 do
ustawienia pozycji EOF plus offset. Dla parametru \s-1GDZIE\s0 można używać
stałych \s-1SEEK_SET\s0, \s-1SEEK_CUR\s0 i \s-1SEEK_END\s0 z modułu
\s-1IO::\s0Seekable lub \s-1POSIX\s0.
.Sp
Zwracana jest nowa pozycja, lub wartość niezdefiniowana w wypadku błędu.
Pozycja zerowa zwracana jest jako łańcuch \*(L"0 but true\*(R"; tak więc
\fIsysseek()\fR zwraca \s-1TRUE\s0 po sukcesie i \s-1FALSE\s0 po błędzie,
lecz wciąż możesz łatwo ustalić nową pozycję.
.Ip "system \s-1LISTA\s0" 8
.IX Item "system \s-1LIST\s0"
Robi dokładnie to samo, co \*(L"exec \s-1LISTA\s0\*(R", poza tym, że
dokonuje przed tym forka i proces rodzicielski czeka, aż dziecko dokona
żywota. Zauważ, że przetwarzanie argumentów różni się, zależnie od liczby
argumentów. Wartość zwracana jest statusem wyjścia programu, zwróconym przez
wywołanie \fIwait()\fR. Aby uzyskać rzeczywistą wartość wyjścia, podziel ją
przez 256. Zobacz też opis \f(CWexec\fR, znajdujący się gdzieś w tym
dokumencie. \fINie\fR jest to sposób, którego należy używać do
przechwytywania wyjścia z komendy, dla tego celu użyj zwykłych odwróconych
apostrofów (backticks?) lub qx//, jak opisano w sekcji
\fI`\s-1ŁAŃCUCH\s0`\fR podręcznika \fIperlop\fR(1).
.Sp
Ponieważ zarówno \fIsystem()\fR i odwrotne apostrofy blokują \s-1SIGINT\s0 i
\s-1SIGQUIT\s0, ubicie ich nie powoduje przerwania twojego programu.
.Sp
.Vb 3
\& @args = ("command", "arg1", "arg2");
\& system(@args) == 0
\& or die "system @args się nie powiódł: $?"
.Ve
A oto bardziej wyrafinowany przykład analizowania wartości zwracanej przez
\fIsystem()\fR. Ma to miejsce na systemie unixowym i jest robione, aby
sprawdzić wszystkie możliwości, włącznie z sygnałami i zrzutami core.
.Sp
.Vb 21
\& $rc = 0xffff & system @args;
\& printf "system(%s) zwrócił %#04x: ", "@args", $rc;
\& if ($rc == 0) {
\& print "normalne zakończenie\en";
\& }
\& elsif ($rc == 0xff00) {
\& print "komenda się nie powiodła: $!\en";
\& }
\& elsif ($rc > 0x80) {
\& $rc >>= 8;
\& print "niezerowy status wyjścia $rc\en";
\& }
\& else {
\& print "skończył z ";
\& if ($rc & 0x80) {
\& $rc &= ~0x80;
\& print "zrzutem core z ";
\& }
\& print "sygnałem $rc\en"
\& }
\& $ok = ($rc != 0);
.Ve
.Ip "syswrite \s-1UCHWYTPLIKU\s0,\s-1SKALAR\s0,\s-1DŁUGOŚĆ\s0,\s-1OFFSET\s0" 8
.IX Item "syswrite \s-1FILEHANDLE\s0,\s-1SCALAR\s0,\s-1LENGTH\s0,\s-1OFFSET\s0"
.Ip "syswrite \s-1UCHWYTPLIKU\s0,\s-1SKALAR\s0,\s-1DŁUGOŚĆ\s0" 8
.IX Item "syswrite \s-1FILEHANDLE\s0,\s-1SCALAR\s0,\s-1LENGTH\s0"
Próbuje zapisać \s-1DŁUGOŚĆ\s0 bajtów ze \s-1SKALARA\s0 do pliku podanego
przez \s-1UCHWYTPLIKU\s0 przy użyciu wywołania systemowego \fIwrite\fR\|(2).
Pomija stdio, więc łączenie tego z odczytami (innymi niż \fIsysread()\fR), z
\fIprint()\fR, \fIwrite()\fR, \fIseek()\fR, lub \fItell()\fR może spowodować
problemy. Zwraca liczbę zapisanych bajtów, lub undef w wypadku błędu. Jeśli
długość jest większa niż dostępne dane, zapisywanych jest tylko tyle danych,
ile jest dostępnych.
.Sp
Dodatkowo można podać \s-1OFFSET\s0, aby zapisać dane z jakiejś części
łańcucha, która nie jest początkiem. Ujemna wartość offsetu nakazuje
zapisywanie od miejsca, przesuniętego o tyle bajtów od końca łańcucha.
.Ip "tell \s-1UCHWYTPLIKU\s0" 8
.IX Item "tell \s-1FILEHANDLE\s0"
.Ip "tell" 8
.IX Item "tell"
Zwraca bieżącą pozycję pliku dla \s-1UCHWYTUPLIKU\s0. \s-1UCHWYTPLIKU\s0
może być wyrażeniem, którego wartość podaje nazwę rzeczywistego uchwytu
pliku. Jeśli \s-1UCHWYTPLIKU\s0 jest pominięty, zakładany jest plik, z
którego ostatnio czytano.
.Ip "telldir \s-1UCHWYTKATALOGU\s0" 8
.IX Item "telldir \s-1DIRHANDLE\s0"
Zwraca bieżącą pozycję funkcji \fIreaddir()\fR dla \s-1UCHWYTUKATALOGU\s0.
Do \fIseekdir()\fR można przekazać wartość, każącą osiągnąc określoną
pozycję w katalogu.
.Ip "tie \s-1ZMIENNA\s0,\s-1NAZWAKLASY\s0,\s-1LISTA\s0" 8
.IX Item "tie \s-1VARIABLE\s0,\s-1CLASSNAME\s0,\s-1LIST\s0"
Funkcja ta łączy zmienną z klasą pakietu, która opisuje jej implementację.
\s-1ZMIENNA\s0 jest nazwą czarowanej zmiennej. \s-1NAZWAKLASY\s0 jest nazwą
klasy, implementującej obiekty właściwego typu. Wszelkie dodatkowe
argumenty są przekazywane metodzie \*(L"new\*(R" klasy (czyli
\s-1TIESCALAR\s0, \s-1TIEARRAY\s0, lub \s-1TIEHASH\s0).
Zazwyczaj, argumenty te wyglądają tak, jak te, które są przekazywane
funkcji \fIdbm_open()\fR z C. Obiekt, zwrócony przez metodę \*(L"new\*(R"
jest też zwracany przez \fItie()\fR, co jest przydatne, jeśli chcesz dostać
się do innych metod w \s-1NAZWIEKLASY\s0.
.Sp
Zauważ, że funkcje takie, jak \fIkeys()\fR i \fIvaluse()\fR mogą zwracać
wielkie wartości tablicowe, jeśli użyć je na dużych obiektach, takich jak
pliki \s-1DBM\s0. Lepiej może być użyć funkcji \fIeach()\fR i na nich
iterować. Przykład:
.Sp
.Vb 7
\& # drukuj offsety pliku historii
\& use NDBM_File;
\& tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0);
\& while (($key,$val) = each %HIST) {
\& print $key, ' = ', unpack('L',$val), "\en";
\& }
\& untie(%HIST);
.Ve
Klasa, implementująca tablicę asocjacyjną, powinna mieć następujące metody:
.Sp
.Vb 8
\& TIEHASH classname, LIST
\& DESTROY this
\& FETCH this, key
\& STORE this, key, value
\& DELETE this, key
\& EXISTS this, key
\& FIRSTKEY this
\& NEXTKEY this, lastkey
.Ve
Klasa, implementująca zwykłą tablicę, powinna mieć następujące metody:
.Sp
.Vb 5
\& TIEARRAY classname, LIST
\& DESTROY this
\& FETCH this, key
\& STORE this, key, value
\& [others TBD]
.Ve
Klasa, implementująca skalar, powinna mieć następujące metody:
.Sp
.Vb 4
\& TIESCALAR classname, LIST
\& DESTROY this
\& FETCH this,
\& STORE this, value
.Ve
W przeciwieństwie do funkcji \fIdbmopen()\fR, funkcja \fItie()\fR nie używa,
lub wymaga dla ciebie modułów (use, require)\*(--musisz o to zadbać
samodzielnie. Zobacz podręcznik \fIDB_File\fR oraz moduł
\fIConfig\fR dla interesujących implementacji \fItie()\fR.
.Ip "tied \s-1ZMIENNA\s0" 8
.IX Item "tied \s-1VARIABLE\s0"
Zwraca referencję do obiektu kryjącego się pod \s-1ZMIENNĄ\s0 (wartość,
która była początkowo zwrócona przez \fItie()\fR, które powiązał zmienną z
pakietem.) Gdy \s-1ZMIENNA\s0 nie jest powiązana, zwracana jest wartość
niezdefiniowana.
.Ip "time" 8
.IX Item "time"
Zwraca liczbę sekund od początku epoki (tj. na MacOs
od 00:00:00, 1 Stycznia, 1904, a od 00:00:00 \s-1UTC\s0, 1 Stycznia, 1970
dla większości innych systemów).
Wystarczające do przekazania dla \fIgmtime()\fR lub \fIlocaltime()\fR.
.Ip "times" 8
.IX Item "times"
Zwraca czteroelementową tablicę, podającą w sekundach czasy użytkownika i
systemu. Wartości są dla tego procesu, oraz dla dzieci tego procesu.
.Sp
.Vb 1
\& ($user,$system,$cuser,$csystem) = times;
.Ve
.Ip "tr///" 8
.IX Item "tr///"
Operator translacji. To samo co y///. Zobacz stronę \fIperlop\fR(1).
.Ip "truncate \s-1UCHWYTPLIKU\s0,\s-1DŁUGOŚĆ\s0" 8
.IX Item "truncate \s-1FILEHANDLE\s0,\s-1LENGTH\s0"
.Ip "truncate \s-1WYRAŻ\s0,\s-1DŁUGOŚĆ\s0" 8
.IX Item "truncate \s-1EXPR\s0,\s-1LENGTH\s0"
Skraca plik, otwarty na \s-1UCHWYCIEPLIKU\s0 lub nazwany przez \s-1WYRAŻ\s0
do podanej długości. Na systemach, gdzie nie jest to zaimplementowane,
powoduje błąd krytyczny.
.Ip "uc \s-1WYRAŻ\s0" 8
.IX Item "uc \s-1EXPR\s0"
.Ip "uc" 8
.IX Item "uc"
Zwraca \s-1WYRAŻ\s0 w dużych literach. Jest to funkcja wewnętrzna,
implementująca escape \eU na łańcuchach ujętych w podwójne cudzysłowy.
Szanuje bieżące ustawienie \s-1LC_CTYPE\s0, jeśli włączono \f(CWuse locale\fR.
Zobacz podręcznik \fIperllocale\fR(1).
.Sp
Jeśli \s-1WYRAŻ\s0 jest pominięte, używa \f(CW$_\fR.
.Ip "ucfirst \s-1WYRAŻ\s0" 8
.IX Item "ucfirst \s-1EXPR\s0"
.Ip "ucfirst" 8
.IX Item "ucfirst"
Zwraca \s-1WYRAŻ\s0, z pierwszym znakiem zmienionym na dużą literę. Jest to
funkcja wewnętrzna, implementująca escape \eu na łańcuchach ujętych w
cudzysłowy.
Szanuje bieżące ustawienie \s-1LC_CTYPE\s0, jeśli włączono \f(CWuse locale\fR.
Zobacz podręcznik \fIperllocale\fR(1).
.Sp
If \s-1EXPR\s0 is omitted, uses \f(CW$_\fR.
.Ip "umask \s-1WYRAŻ\s0" 8
.IX Item "umask \s-1EXPR\s0"
.Ip "umask" 8
.IX Item "umask"
Ustawia umaskę procesu na \s-1WYRAŻ\s0 i zwraca wartość poprzednią. Jeśli
\s-1WYRAŻ\s0 jest pominięte, po prostu zwraca bieżącą umaskę. Pamiętaj, że
umaska jest liczbą, zazwyczaj podawaną ósemkowo; \fInie\fR jest łańcuchem
cyfr ósemkowych. Zobacz opis \f(CWoct\fR, znajdujący się gdzieś w tym
dokumencie, jeśli masz tylko łańcuch.
.Ip "undef \s-1WYRAŻ\s0" 8
.IX Item "undef \s-1EXPR\s0"
.Ip "undef" 8
.IX Item "undef"
Powoduje, że wartość \s-1WYRAŻ\s0, która musi być lwartością, staje się
niezdefiniowana. Używaj tego tylko na wartościach skalarnych, całej tablicy,
całej tablicy asocjacyjnej, lub na nazwie podprocedury (przy użyciu
\*(L"&"). (Używanie tej funkcji w innych wypadkach przypuszczalnie nie
doprowadzi do takich rezultatów, jakich można by oczekiwać.) Zawsze zwraca
wartość niezdefiniowaną. Możesz pominąć \s-1WYRAŻ\s0--w tym wypadku nic nie
jest pozbawiane zdefiniowania, lecz mimo to uzyskujesz wartość
niezdefiniowaną, którą możesz np. zwrócić z podprocedury, przypisać
zmiennej,lub przekazać jako parametr. Przykłady:
.Sp
.Vb 8
\& undef $foo;
\& undef $bar{'blurfl'}; # Porównaj z: delete $bar{'blurfl'};
\& undef @ary;
\& undef %hash;
\& undef &mysub;
\& return (wantarray ? (undef, $errmsg) : undef) if $they_blew_it;
\& select undef, undef, undef, 0.25;
\& ($a, $b, undef, $c) = &foo; # Ignoruj trzecią zwróconą wartość
.Ve
.Ip "unlink \s-1LISTA\s0" 8
.IX Item "unlink \s-1LIST\s0"
.Ip "unlink" 8
.IX Item "unlink"
Kasuje listę plików. Zwraca liczbę skasowanych plików.
.Sp
.Vb 3
\& $cnt = unlink 'a', 'b', 'c';
\& unlink @goners;
\& unlink <*.bak>;
.Ve
Uwaga: unlink nie skasuje katalogów, chyba że jesteś superużytkownikiem i
przekazałeś perlowi flagę \fB\-U\fR. Nawet gdy te warunki są spełnione, bądź
ostrzeżony, że skasowanie katalogu może wywołać uszkodzenie systemu plików.
Zamiast tego użyj rmdir.
.Sp
Jeśli \s-1LISTA\s0 jest pominięta, używa \f(CW$_\fR.
.Ip "unpack \s-1WZORZEC\s0,\s-1WYRAŻ\s0" 8
.IX Item "unpack \s-1TEMPLATE\s0,\s-1EXPR\s0"
Unpack robi odwrotność tego, co pack: pobiera łańcuch, reprezentujący
strukturę
i rozwija go na listę wartości, zwracają wartość tablicową (w kontekście
skalarnym zwraca tylko pierwszą wartość tablicy). \s-1WZORZEC\s0 jest tego
samego formatu co dla funkcji pack. Oto podprocedura, która dokonuje
substringu:
.Sp
.Vb 4
\& sub substr {
\& local($what,$where,$howmuch) = @_;
\& unpack("x$where a$howmuch", $what);
\& }
.Ve
a potem mamy
.Sp
.Vb 1
\& sub ordinal { unpack("c",$_[0]); } # to samo co ord()
.Ve
Dodatkowo, możesz poprzedzić pola %<liczbą>, wskazując, że chcesz
<liczba>-bitową sumę szesnastkową elementów, zamiast samych elementów.
Domyślna jest suma 16-bitowa. Na przykład, następujący przykład oblicza tę
samą liczbę co program sum z Systemu V:
.Sp
.Vb 4
\& while (<>) {
\& $checksum += unpack("%16C*", $_);
\& }
\& $checksum %= 65536;
.Ve
Następujący fragment efektywnie oblicza liczbę ustawionych bitów w wektorze
bitowym:
.Sp
.Vb 1
\& $setbits = unpack("%32b*", $selectmask);
.Ve
.Ip "untie \s-1ZMIENNA\s0" 8
.IX Item "untie \s-1VARIABLE\s0"
Rozbija powiązanie między zmienną, a pakietem. Zobacz \fItie()\fR.
.Ip "unshift \s-1TABLICA\s0,\s-1LISTA\s0" 8
.IX Item "unshift \s-1ARRAY\s0,\s-1LIST\s0"
Robi odwrotną rzecz do \f(CWshift\fR. Lub odwrotną do \f(CWpush\fR, zależnie
jak na to spojrzeć. Dokleja listę do początku tablicy i zwraca nową liczbę
elementów.
.Sp
.Vb 1
\& unshift(ARGV, '\-e') unless $ARGV[0] =~ /^\-/;
.Ve
Zauważ, że \s-1LISTA\s0 jest doklejana cała, a nie jeden element naraz, więc
doklejone elementy pozostają w tej samej kolejności. Aby ją odwrócić, użyj
reverse.
.Ip "use Module \s-1LISTA\s0" 8
.IX Item "use Module \s-1LIST\s0"
.Ip "use Module" 8
.IX Item "use Module"
.Ip "use Module \s-1WERSJA\s0 \s-1LISTA\s0" 8
.IX Item "use Module \s-1VERSION\s0 \s-1LIST\s0"
.Ip "use \s-1WERSJA\s0" 8
.IX Item "use \s-1VERSION\s0"
Importuje semantykę danego modułu do bieżącego pakietu. Ogólnie aliasuje
określone podprocedury lub nazwy zmiennych do twojego pakietu. Jest to
dokładnie równoważne
.Sp
.Vb 1
\& BEGIN { require Module; import Module LIST; }
.Ve
poza tym, że Module \fImusi\fR być gołym słowem.
.Sp
Jeśli pierwszy argument \f(CWuse\fR jest liczbą, to jest ona traktowana jako
numer wersji, zamiast nazwa modułu. Jeśli wersja interpretera perla jest
mniejsza niż \s-1WERSJA\s0, to wyświetlony zostanie komunikat o błędzie, a
perl natychmiast zakończy działanie. Jest to często przydatne, jeśli chcesz
sprawdzić wersję perla przed używaniem modułów bibliotecznych, które
zmieniły się w sposób niekompatybilny od czasu starszych wersji perla.
(staramy się by tak nie było.)
.Sp
Słowo \s-1BEGIN\s0 wymusza by require i import zaszły podczas kompilacji.
Require zapewnia, że moduł będzie załadowany do pamięci, jeśli wcześniej nie
był. Import nie jest wbudowany\*(--jest to tylko zwykłe, statyczne
wywołanie metody pakietu \*(L"Module\*(R" aby powiedzieć modułowi, by
zaimportował
listę właściwości do pakietu bieżącego. Moduł może implementować swoją
metodę import w dowolny sposób, choć większość modułów woli wyprowadzać
swoją metodę
poprzez dziedziczenie z klasy Exporter, zdefiniowanej w module Exporter,
Zobacz podręcznik \fIExporter\fR.
Jeśli nie ma żadnej metody importującej, to błąd jest cicho ignorowany. Może
się to w przyszłych wersjach zmienić na błąd krytyczny.
.Sp
Jeśli nie chcesz zmieniania swojej przestrzeni nazw, załącz jawnie pustą
listę:
.Sp
.Vb 1
\& use Module ();
.Ve
Jest to dokładnie równoważne
.Sp
.Vb 1
\& BEGIN { require Module; }
.Ve
Jeśli między Module, a \s-1LISTA\s0 jest obecny argument \s-1WERSJA\s0, to
\f(CWuse\fR wywoła metodę \s-1VERSION\s0 klasy Module z podaną wersją, jako
argumentem. Domyślna metoda \s-1VERSION\s0, dziedziczona z klasy Universal,
zakracze jeśli podana wersja jest większa niż wartość zmiennej
\f(CW$Module::VERSION\fR. (Zauważ, że nie ma przecinka po \s-1WERSJI\s0!)
.Sp
Ponieważ jest to szeroko otwarty interfejs, można tak implementować też
pragmy (dyrektywy kompilatora). Obecnie zaimplementowane pragmy to:
.Sp
.Vb 5
\& use integer;
\& use diagnostics;
\& use sigtrap qw(SEGV BUS);
\& use strict qw(subs vars refs);
\& use subs qw(afunc blurfl);
.Ve
Te pseudo moduły importują semantykę do bieżącego zakresu bloku, w
przeciwieństwie do zwykłych modułów, które importują symbole do bieżącego
pakietu.
.Sp
Istnieje odpowiadająca komenda \*(L"no\*(R", która de-importuje rzeczy
zaimportowane przez use, np. wywołuje metodę
\f(CWunimport Module LISTA\fR zamiast \f(CWimport\fR.
.Sp
.Vb 2
\& no integer;
\& no strict 'refs';
.Ve
Jeśli nie ma metody unimport, wywołanie to kończy się błędem krytycznym.
.Sp
Dla listy standardowych modułów i pragm, zobacz podręcznik \fIperlmod\fR.
.Ip "utime \s-1LISTA\s0" 8
.IX Item "utime \s-1LIST\s0"
Zmienia czasy dostępu i modyfikacji na każdym pliku z listy. Pierwsze dwa
elementy listy muszą być numerycznymi czasami dostępu i modyfikacji,
dokładnie w tej kolejności. Zwraca liczbę plików, na których operacja się
powiodła. Czas modyfikacji inode jest ustawiany na czas bieżący. Przykład
komendy \*(L"touch\*(R":
.Sp
.Vb 3
\& #!/usr/bin/perl
\& $now = time;
\& utime $now, $now, @ARGV;
.Ve
.Ip "values \s-1HASH\s0" 8
.IX Item "values \s-1HASH\s0"
Zwraca normalną tablicę, składającą się ze wszystkich wartości wymienionej
tablicy asocjacyjnej. W kontekście skalarnym, zwracana jest liczba wartości.
Wartości są zwracane w dość losowej kolejności, lecz jest ona ta sama, co
zwracana przez funkcje \fIkeys()\fR lub \fIeach()\fR. Jako efekt uboczny,
funkcja resetuje iterator tablicy asocjacyjnej. Zobacz też
\fIkeys()\fR, \fIeach()\fR, i \fIsort()\fR.
.Ip "vec \s-1WYRAŻ\s0,\s-1OFFSET\s0,\s-1BITY\s0" 8
.IX Item "vec \s-1EXPR\s0,\s-1OFFSET\s0,\s-1BITS\s0"
Traktuje łańcuch \s-1WYRAŻ\s0 jako wektor całkowitych integerów i zwraca
wartość pola bitowego, wskazanego przez \s-1OFFSET\s0. \s-1BITY\s0 podają
liczbę bitów, które są zarezerwowane dla każdego wpisu w wektorze bitowym.
Musi to być potęga dwójki do 1 do 32. \fIvec\fR może też być przypisany do
czegoś--w tym wypadku potrzebne są nawiasy, aby nadać wyrażeniu właściwy
priorytet, jak w
.Sp
.Vb 1
\& vec($image, $max_x * $x + $y, 8) = 3;
.Ve
Wektory utworzone przez \fIvec()\fR mogą też być obsługiwane przez
operatory logiczne |, & i ^, które założą, że bitowa operacja wektorowa jest
oczekiwana gdy obydwa operandy są łańcuchami.
.Sp
Aby przekształcić wektor bitowy na tablicę łańcuchową zer i jedynek, użyj:
.Sp
.Vb 2
\& $bits = unpack("b*", $vector);
\& @bits = split(//, unpack("b*", $vector));
.Ve
Jeśli znasz dokładną długość w bitach, możesz podać ją zamiast *.
.Ip "wait" 8
.IX Item "wait"
Czeka, aż proces potomny się nie zakończy i zwraca pid zamkniętego procesu,
lub \-1, jeśli go nie było. Status jest zwracany w \f(CW$?\fR.
.Ip "waitpid \s-1PID\s0,\s-1FLAGI\s0" 8
.IX Item "waitpid \s-1PID\s0,\s-1FLAGS\s0"
Czeka, aż proces potomny się zakończy i zwraca pid zamkniętego procesu, lub
\-1, jeśli nie było takiego procesu. Status jest zwracany w \f(CW$?\fR.
Jeśli powiesz
.Sp
.Vb 3
\& use POSIX ":sys_wait_h";
\& ...
\& waitpid(\-1,&WNOHANG);
.Ve
to możesz dokonać nieblokującego oczekiwania na dowolny proces. Nieblokujące
oczekiwanie jest dostępne na maszynach, obsługujących albo wywołanie
\fIwaitpid\fR\|(2), albo \fIwait4\fR\|(2). Jednak oczekiwanie na konkretny
pid z \s-1FLAGAMI\s0 wartości 0 jest zaimplementowane wszędzie. (Perl
emuluje wywołanie systemowe, pamiętając wartości statusu procesów, które
zakończyły się, lecz nie były odczytane przez skrypt perla)
.Ip "wantarray" 8
.IX Item "wantarray"
Zwraca \s-1TRUE\s0, jeśli kontekst obecnie wykonywanej podprocedury szuka
wartości listowej. Zwraca \s-1FALSE\s0, jeśli kontekst szuka skalara.
Zwraca wartość niezdefiniowaną, jeśli kontekst nie szuka wartości (void).
.Sp
.Vb 3
\& return unless defined wantarray; # nie myśl o robieniu więcej
\& my @a = complex_calculation();
\& return wantarray ? @a : "@a";
.Ve
.Ip "warn \s-1LIST\s0" 8
.IX Item "warn \s-1LIST\s0"
Produkuje komunikat na \s-1STDERR\s0, podobnie jak \fIdie()\fR, lecz nie
wychodzi i nie wyrzuca wyjątku.
.Sp
Jeśli zainstalowany jest handler \f(CW$SIG{__WARN__)\fR, nie są drukowane
żadne komunikaty. Od handlera zależy obsługa komunikatu, gdy tak zadecyduje
(np. przekonwertowanie go na \fIdie()\fR). Większość handlerów musi więc
wywoływać \fIwarn()\fR ponownie, aby wyświetlić komunikat. Zauważ, że jest
to bezpieczne i nie spowoduje nieskończonej pętli, gdyż haki
\f(CW__WARN__\fR nie są wołane z niego samego.
.Sp
Zachowanie to jest trochę inne od tego dla \f(CW$SIG{__DIE__}\fR (które nie
powstrzymywały tekstu komunikatów, lecz mogły wywołać \fIdie()\fR ponownie,
aby je zmienić).
.Sp
Używanie handlerów \f(CW__WARN__\fR daje potężne narzędzie do wyciszania
wszystkich ostrzeżeń (nawet tak zwanych obowiązkowych). Na przykład:
.Sp
.Vb 7
\& # wywal wszystkie ostrzeżenia czasu kompilacji
\& BEGIN { $SIG{'__WARN__'} = sub { warn $_[0] if $DOWARN } }
\& my $foo = 10;
\& my $foo = 20; # bez ostrzegania o zduplikowaniu my $foo
\& # lecz przecież sam się o to prosiłeś!
\& # bez ostrzeżeń czasu kompilacji i czasu działania przed tym miejscem
\& $DOWARN = 1;
.Ve
.Vb 2
\& # ostrzeżenia czasu działania są tu włączone
\& warn "\e$foo is alive and $foo!"; # pojawia się
.Ve
Zobacz stronę \fIperlvar\fR(1) dla szczegółów o ustawianiu wpisów
\f(CW%SIG\fR i dla przykładów.
.Ip "write \s-1UCHWYTPLIKU\s0" 8
.IX Item "write \s-1FILEHANDLE\s0"
.Ip "write \s-1WYRAŻ\s0" 8
.IX Item "write \s-1EXPR\s0"
.Ip "write" 8
.IX Item "write"
Zapisuje sformatowany rekord (prawdopodobnie wieloliniowy) do podanego
pliku, używając formatu związanego z tym plikiem. Domyślnie format dla pliku
jest tym, który ma tę samą nazwę, co uchwyt pliku, lecz można go zmienić z
pomocą funkcji \fIselect()\fR, przypisując nazwę formatu zmiennej \f(CW$~\fR.
.Sp
Początek przetwarzania formy jest obsługiwany automatycznie: jeśli nie
ma miejsca na stronie na sformatowany rekord, to strona jest przewijana
przez wpisanie form feed, następnie używany jest specjalny format
góry-strony (do formatowania nagłówka nowej strony), a potem wpisany jest
rekord. Domyślnie, format góry-strony jest nazwą uchwytu pliku z dodanym
\*(L"_TOP\*(R", lecz można go ustawić dynamicznie, przyznając zmiennej
\f(CW$^\fR nazwę podczas gdy wybrany (select) jest uchwyt pliku.
Liczba pozostających linii bieżącej strony znajduje się w zmiennej
\f(CW$-\fR i może być ustawiona na 0 aby wymusić nową stronę.
.Sp
Jeśli \s-1UCHWYTPLIKU\s0 nie jest podany, wyjście idzie do bieżącego
domyślnego kanału wyjścia, którym jest początkowo \s-1STDOUT\s0, a który
może być zmieniony operatorem \f(CWselect\fR. Jeśli \s-1UCHWYTPLIKU\s0 jest
wyrażeniem \s-1WYRAŻ\s0, to jest ono analizowane, a wynikowy łańcuch jest
używany do podejrzenia nazwy \s-1UCHWYTUPLIKU\s0. Dla dalszych informacji o
formatach, zobacz stronę \fIperlform\fR(1).
.Sp
Zauważ, że zapis \fI\s-1NIE\s0\fR jest odwrotnością odczytu. Niestety.
.Ip "y///" 8
.IX Item "y///"
Operator translacji. To samo co tr///. Zobacz stronę \fIperlop\fR(1).
.rn }` ''
.SH "INFORMACJE O TŁUMACZENIU"
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i
\fImoże nie być aktualne\fR. W razie zauważenia różnic między powyższym opisem
a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie
się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:
.IP
man \-\-locale=C 1 perlfunc
.PP
Prosimy o pomoc w aktualizacji stron man \- więcej informacji można znaleźć pod
adresem http://sourceforge.net/projects/manpages\-pl/.
|